web-dev-qa-db-fra.com

SQL Server stocke plusieurs valeurs dans une variable SQL

J'ai la requête suivante:

select * 
from cars 
where make in ('BMW', 'Toyota', 'Nissan')

Ce que je veux faire, c'est stocker les paramètres where dans une variable SQL.

Quelque chose comme:

declare @caroptions varchar(max);
select @caroptions =  select distinct(make) from carsforsale;
print @caroptions;
select * from cars where make in (@caroptions)

Le problème est que l’impression de @caroptions n’a que le dernier résultat renvoyé par:

select distinct(make) from carsforsale;

Je veux qu'il stocke plusieurs valeurs.

Des idées?

7
Smudger

Vous pouvez utiliser une variable de table:

declare @caroptions table
(
    car varchar(1000)
)

insert into @caroptions values ('BMW')
insert into @caroptions values ('Toyota')
insert into @caroptions values ('Nissan')

select * from cars where make in (select car from @caroptions)
8
Christian Specht

J'ai écrit à ce sujet ici si vous voulez le voir en détail. En attendant, vous ne pouvez pas le faire exactement comme vous le pensez.

Vos choix sont:

En utilisant la commande LIKE:

DECLARE @CarOptions varchar(100)
SET @CarOptions = 'Ford, Nisan, Toyota'

SELECT *
FROM Cars
WHERE ','+@CarOptions+',' LIKE ',%'+CAST(Make AS varchar)+',%'

Une fonction spliter

DECLARE @CarOptions varchar(100)
SET @CarOptions = 'Ford, Nisan, Toyota'

SELECT Cars.*
FROM Cars
JOIN DelimitedSplit8K (@CarOptions,',') SplitString
    ON Cars.Make = SplitString.Item

Dyanmic SQL

DECLARE @CarOptions varchar(100)
SET @CarOptions = 'Ford, Nisan, Toyota'

DECLARE @sql nvarchar(1000)

SET @sql = 'SELECT * ' + 
            'FROM Cars ' + 
            'WHERE Make IN ('+@CarOptions+') '

EXEC sp_executesql @sql

En attendant, votre meilleure option sera de vous débarrasser complètement de la variable.

SELECT * FROM cars WHERE make IN (SELECT make FROM carsforsale );
4
Kenneth Fisher

pourquoi pas?

SELECT * FROM cars WHERE make IN (SELECT DISTINCT(make) FROM carsforsale)
1
Diego
Fetch 1 value in table and store in variable    
=======================================================================================

Declare @query int

    select @query = p.ProductID From Product p inner join ReOrdering as r on 
    p.ProductID = r.ProductID and r.MinQty >= p.Qty_Available

    print @query
1
Mohit Kotak

Utilisez CTE pour stocker plusieurs valeurs dans une seule variable.

;WITH DATA1 AS 
(
    select car_name
    from cars 
    where make in ('BMW', 'Toyota', 'Nissan')
)
SELECT @car_name = CONCAT(@car_name,',',car_name)
FROM DATA1

select @car_name
1
user10916093

vous pouvez utiliser l'instruction JOIN.

SELECT distinct c.*
FROM cars c
JOIN carsfrosale s
ON s.id = c.fk_s

Si vous voulez filtrer votre liste de voitures, vous pouvez ajouter

WHERE s.id in (....)
0
Joe Taras