SQL Server хранит несколько значений в переменной sql

У меня есть следующий запрос:

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

То, что я хочу сделать, это сохранить параметры where в переменной SQL.

Что-то вроде:

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

Проблема в печати @caroptions только последний результат вернулся из:

select distinct(make) from carsforsale;

Я хочу, чтобы хранить несколько значений.

Есть идеи?

7 ответов

Решение

Вы можете использовать табличную переменную:

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)

Я написал об этом здесь, если вы хотите увидеть это подробно. В то же время, вы не можете сделать это именно так, как вы думаете.

Ваш выбор:

Используя команду LIKE:

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

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

Функция разделения

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

В то же время лучшим вариантом будет полное избавление от переменной.

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

Используйте CTE для хранения нескольких значений в одной переменной.

;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

Почему бы и нет?

SELECT * FROM cars WHERE make IN (SELECT DISTINCT(make) FROM carsforsale)
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

Вы можете использовать оператор JOIN.

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

Если вы хотите отфильтровать свой список автомобилей для продажи, вы можете добавить

WHERE s.id in (....)

В TSQL вы можете использовать STRING_AGG таким образом

      select STRING_AGG(car_name,',') as csv
from cars 
where make in ('BMW', 'Toyota', 'Nissan')
Другие вопросы по тегам