2012-07-17 41 views
-1

以下參數類似於(2,3,4,5)或(2),或者甚至爲NULL,ServiceEntryPart列可能具有如下代碼部分中的數據。我的問題是什麼將是正確的語法,所以我可以使用過濾器。如果過濾器是NULL,我會完全忽略它。我至今工作正常,如果它是一個NULL(不包括過濾器),但是當我有例如(1,2)帕拉姆,這是行不通的..謝謝SQL如何在使用ISNULL時使用IN

ServiceEntryPart.ServiceTypeIDs 
4,3 
3 
NULL 
1 
8 
2,5 

--Filter: 
    @ServiceTypes nvarchar(100) = NULL 

--Filter with values SET @ServiceTypes = (1,2,4,5)  

--Where Clause 
WHERE (ServiceEntryPart.ServiceTypeIDs = ISNULL(@ServiceTypes,ServiceEntryPart.ServiceTypeIDs) 
+0

無論是否帶有ISNULL,您都無法將整個IN列表作爲單個命名參數傳遞給查詢。 – dasblinkenlight 2012-07-17 19:30:15

+0

那麼你說的解決方案是什麼? – user1475788 2012-07-17 19:30:39

+0

你需要定義你想要的行爲。如果參數是@ServiceTypes爲null,您是否想要a)忽略該參數或者b)僅拾取空值?打破1NF也不是好主意。 – 2012-07-17 19:31:12

回答

1

它看起來像你想傳入一個IN子句的變量列表。一種方法是使用動態SQL,但我會說這是過度殺毒。

你可以嘗試這樣的:

where @ServiceTypes is null or 
     charindex(','+cast(ServiceEntryPart.ServiceTypeIDs as varchar(255)+',', 
       ','[email protected]+',') > 0 

這是使用字符串搜索做的等價物。它假定@ServiceTypes是一個逗號分隔列表,不含空格。它預先和後綴逗號。當你尋找類似5的東西時,它確實會查找「,5」,因此它不匹配列表中的25或55。

+0

我明白了,這太棒了!欣賞你的答案! :) – user1475788 2012-07-17 20:23:36