SQL Server在sql变量中存储多个值

Smu*_*ger 7 sql sql-server arrays variables stored-procedures

我有以下查询:

select * 
from cars 
where make in ('BMW', 'Toyota', 'Nissan')
Run Code Online (Sandbox Code Playgroud)

我想要做的是将where参数存储在SQL变量中.

就像是:

declare @caroptions varchar(max);
select @caroptions =  select distinct(make) from carsforsale;
print @caroptions;
select * from cars where make in (@caroptions)
Run Code Online (Sandbox Code Playgroud)

问题是打印@caroptions只返回最后一个结果:

select distinct(make) from carsforsale;
Run Code Online (Sandbox Code Playgroud)

我希望它存储多个值.

有任何想法吗?

Chr*_*cht 8

您可以使用表变量:

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)
Run Code Online (Sandbox Code Playgroud)

  • 似乎与“从制造商的汽车中选择 *('BMW'、'Toyota'、'Nissan')”没有太大区别。但是它们被放入了表变量中。这是一种浪费,除非多次使用该变量。 (3认同)

Ken*_*her 5

如果您想详细了解,我在这里写了相关内容。与此同时,你不能完全按照你的想法去做。

您的选择是:

使用 LIKE 命令:

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

SELECT *
FROM Cars
WHERE ','+@CarOptions+',' LIKE ',%'+CAST(Make AS varchar)+',%'
Run Code Online (Sandbox Code Playgroud)

分离器功能

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

SELECT Cars.*
FROM Cars
JOIN DelimitedSplit8K (@CarOptions,',') SplitString
    ON Cars.Make = SplitString.Item
Run Code Online (Sandbox Code Playgroud)

动态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
Run Code Online (Sandbox Code Playgroud)

与此同时,你最好的选择是完全摆脱变量。

SELECT * FROM cars WHERE make IN (SELECT make FROM carsforsale );
Run Code Online (Sandbox Code Playgroud)