2011-11-04 78 views
2

我可以将字符串列表分配给变量以在IN语句中使用而不使用动态SQL?将变量设置为IN语句的字符串列表

我正在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) 
+0

可能重复[参数化SQL IN子句?](http://stackoverflow.com/questions/337704/parameterizing-a-sql-in-clause)(虽然这并不具体说明报告服务) –

回答

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这在这样的条件检查快很多,但你不会得到显著的性能改进由于小件物品cound(1-2)

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

因为这个选择的类型是我工作场所中反复出现的情况,我将继续前进,并为这些值关联建立一个永久表,并在IN子句中使用子查询,就像您展示的那样。感谢您的灵感。 – hqrsie

+0

@hqrsie - 您也可以将表值参数传递给存储过程。不知道报告服务有多直接(或不是)。 –

+0

@hqrsie:我刚刚更新了我的答案,因为第一个版本的错误(作为单个varchar项目返回'third,fourth') – sll

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 ('[email protected]+')' 
exec @query 

三重引号是因为字符串连接机制

0去
+0

你试过这个吗?我相信这不应该起作用,因为你已经在IN()子句中指定了varchar(50)类型的单个变量:'IN(@items)' – sll

+0

TBH,我已经能够使用Dynamic-SQL,但是正按照我的问题的第一行,试图找到一种方法来解决问题。 – hqrsie

相关问题