2011-06-21 106 views
0
SELECT [ID] + ' - ' + CAST([OfficeID] as char(5)) AS [ZoneID] , [Name] FROM [dbo].[ZoneByOffice] 
WHERE ([OfficeID] IN (@Office)) 
AND (('0003' in @Activity) OR ('0007' in @Activity)) 
ORDER BY [Name] ASC 

該SQL腳本將在獲取數據源失敗,彈出框將要求「@Activity」和「@Office」的定義,即使這些參數存在。幫助這個SQL語法

但如果我對待「@Activity」作爲一個非數組值,就像這樣:

SELECT [ID] + ' - ' + CAST([OfficeID] as char(5)) AS [ZoneID] , [Name] FROM [dbo].[ZoneByOffice] 
WHERE ([OfficeID] IN (@Office)) 
AND ((@Activity ='0003') OR (@Activity = '0007')) 
ORDER BY [Name] ASC 

那麼就不會提示定義,但該報告,如果我選擇了多個胡亞蓉項目,它會在語法中報告','逗號並失敗。

回答

0

如果@Activity是一個值,那麼你可以使用

(@Activity IN ('0003', '0007')) 

但如果@Activity是一個逗號分隔值列表,你不能把它作爲一個參數反正。 SQL參數永遠不能替代值列表 - 只有單個值。如果爲參數傳遞的字符串看起來像一個數字列表,那沒關係。它仍然只是一個單一的值,恰好是一串數字和逗號。

您可以嘗試this trick,由Joel Spolsky的推廣自己的堆棧溢出:

WHERE ',' + @Activity + ',' LIKE '%,' + '0003' + ',%' 
    OR ',' + @Activity + ',' LIKE '%,' + '0007' + ',%' 

但是它執行了苦頭,因爲在模式上的前導通配符強制執行表掃描。

+0

感謝您的教育把戲,但我發現我所要做的只是將@Activity像(@Activity)中的''000''括起來以使其工作> _ < – CodeMinion

+0

不要指望在任何其他品牌的數據庫上工作。 –

+0

謝謝比爾,我會牢記這一點 – CodeMinion