8 votes

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 l'impression de @caroptions a seulement le dernier résultat retourné de :

select distinct(make) from carsforsale;

Je veux qu'il puisse stocker plusieurs valeurs.

Des idées ?

13voto

Christian Specht Points 15907

Vous pouvez utiliser une variable de tableau :

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)

5voto

Kenneth Fisher Points 3462

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

Vous avez le choix :

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 d'éclatement

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

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

SQL Dyanmic

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 est de vous débarrasser complètement de la variable.

SELECT * FROM cars WHERE make IN (SELECT make FROM carsforsale );

2voto

user10916093 Points 21

Utilisez le 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

1voto

Diego Points 13953

Pourquoi pas ?

SELECT * FROM cars WHERE make IN (SELECT DISTINCT(make) FROM carsforsale)

1voto

mohit kotak Points 15
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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X