2011-11-04 79 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

相關問題