将变量设置为IN语句的字符串列表

时间:2011-11-04 13:13:50

标签: sql-server-2008 tsql ssrs-2008

我可以在不使用动态SQL的情况下为变量中的变量分配字符串列表吗?

我正在SSRS中开发一个报告,它允许用户选择三个可能值中的一个作为参数,然后将参数分配给IN语句。有些参数只有一个值相关,有些参数有几个。

案例1和案例2正常运行,但案例3没有运行,因为它是作为标量值而不是列表传递的。我尝试了各种方法来绕过每个项目的引号,但它不起作用。

declare @items as varchar(50)
set @items =
  CASE @parameter
    WHEN 1 then 'first'
    WHEN 2 then 'second'
    WHEN 3 then 'third, fourth'
  END

select column1
from table1
where column1 IN (@items)

2 个答案:

答案 0 :(得分:4)

不,你不能。您可以按以下方式使用表变量:

DECLARE @table TABLE(item varchar(50))

IF @parameter = 3
BEGIN 
   INSERT INTO @table(item) VALUES ('third'), ('fourth')
END
ELSE
 BEGIN
   INSERT INTO @table VALUES(
     CASE @parameter      
        WHEN 1 then 'first'
       WHEN 2 then 'second'
     END 
    )
 END

-- And use IN(subquery)
SELECT column1     
FROM table1     
WHERE column1 IN (SELECT item FROM @table) 

此外,你可以在这种条件检查中更快地使用EXISTS,但由于小件物品而无法获得显着的性能提升(1-2)

SELECT column1     
FROM table1 t
WHERE EXISTS (SELECT * FROM @table WHERE item = t.column1) 

答案 1 :(得分:0)

你可以使用动态sql(未测试)

declare @items as varchar(50)
set @items =
  CASE @parameter
    WHEN 1 then '''first'''
    WHEN 2 then '''second'''
    WHEN 3 then '''third'', ''fourth'''
  END

declare @query = 'select column1 from table1 where column1 IN ('+@items+')'
exec @query

三重引号是由字符串连接机制引起的