2011-08-12 45 views
0

我有一個大的T-SQL查詢(我只在這裏放了一部分,因爲我非常肯定,其餘工作不錯):T-SQL奇怪的問題

WHERE /* 
       ******* missing filter ******* 
       this line should filter the risks by @LoggedInPersonID via role 
       ****************************** 
      AND */(@PropertyID IS NULL OR p.PropertyID = @PropertyID) 
      AND (@PCodePattern IS NULL OR p.PCode LIKE @PCodePattern) 
      AND (@ZipCodeIDS IS NULL 
       OR p.ZipCodeID IN (@ZipCodeIDS)) 

您會注意到@ZipCodeIDS是一個列表。 ..嗯,我用一些ID代碼填充這個。當@ZipCodeIDS包含一個單一的ID它完美的作品,但如果我嘗試發送多個ID(例如:「14,15」),它會給我錯誤....

你有任何線索嗎?

PS:當然,我做了@ZIpCodeIDS VARCHAR,因爲我們沒有數組中的T-SQL ...

更新:如果我直接在查詢硬編碼:IN (14,11)它完美的作品...所以我莫名其妙不正確地從我的多個值,我認爲它不會看到代碼發送這個參數「」作爲分隔符...

更新2:試圖分裂名單,並把ID添加到一個表.. 。當zipCodeIDS只有一個id時,查詢完美。對於多個人,不是......你在ELSE上看到什麼奇怪的東西嗎?

IF @ZipCodeIDS IS NOT NULL 
BEGIN 
    IF CHARINDEX(',', @ZipCodeIDS) = 0 
    BEGIN 
     insert @listofIDS values(@ZipCodeIDS) 
    END 
    ELSE 
    BEGIN 
     WHILE CHARINDEX(',', @ZipCodeIDS) != 0 
     BEGIN 
      insert @listofIDS values(Left(@ZipCodeIDS, PatIndex(',', @ZipCodeIDS) - 1)) 
      SET @ZipCodeIDS = SUBSTRING(@ZipCodeIDS, CHARINDEX(',',@ZipCodeIDS)+1, LEN(@ZipCodeIDS) - CHARINDEX(',',@ZipCodeIDS)) 
     END 
    END 
END 
+0

您可以打印出查詢以查看它的實際外觀。 – NullUserException

回答

1
Declare @listofIDS table(zipcodeids varchar(10)) 

Declare @ZipCodeIDS varchar(100) 
set @ZipCodeIDS= '14,15' 

set @ZipCodeIDS+= ',' 
;with cte as 
(
select substring(@ZipCodeIDS, 1, charindex(',', @ZipCodeIDS) - 1) num, charindex(',', @ZipCodeIDS) pos 
union all 
select substring(@ZipCodeIDS, pos + 1, charindex(',', @ZipCodeIDS, pos +1) - pos - 1) num, charindex(',', @ZipCodeIDS, pos +1) 
from cte 
where charindex(',', @ZipCodeIDS, pos +1) > 0 

) 
INSERT @listofIDS 
select num from cte 


.... or p.ZipCodeID in (select zipcodeids from @listofIDS) 

-------------------- 

試試這個(記得設置所有的變量):

Declare @ZipCodeIDS varchar(100) 
set @ZipCodeIDS= '14,15' 

set @ZipCodeIDS+= ',' 
;with cte as 
(
select cast(substring(@ZipCodeIDS, 1, charindex(',', @ZipCodeIDS) - 1) as int) num, charindex(',', @ZipCodeIDS) pos 
union all 
select cast(substring(@ZipCodeIDS, pos + 1, charindex(',', @ZipCodeIDS, pos +1) - pos - 1) as int) num, charindex(',', @ZipCodeIDS, pos +1) 
from cte 
where charindex(',', @ZipCodeIDS, pos +1) > 0 
) 

SELECT /*... rest of your query that was not included in the question. no colon, nor anything else, just your query plus the small alteration i made in the end 
... 
...*/ 
WHERE /* 
       ******* missing filter ******* 
       this line should filter the risks by @LoggedInPersonID via role 
       ****************************** 
      AND */(@PropertyID IS NULL OR p.PropertyID = @PropertyID) 
      AND (@PCodePattern IS NULL OR p.PCode LIKE @PCodePattern) 
      AND (@ZipCodeIDS IS NULL 
       OR p.ZipCodeID IN (select num from cte)) 
+0

似乎有趣的解決方案與桌..但請記住,我可以有N個ID ...有沒有辦法插入n個值? –

+0

是的,我做了一個recusive sql來將你的文本分成幾個ID並用它們填充臨時表 –

+0

你知道嗎,有沒有辦法看到這個臨時表值?似乎即使你的代碼不工作,我想確保它正確地將分割值放入表中... –

2

您不能像這樣使用IN。它試圖尋找郵政編碼等於'14,15'的p.ZipCodeID,在你的例子中。

相反,您必須比較p.ZipCodeID到,每個郵政編碼您需要,例如

... OR p.ZipCodeID=14 OR p.ZipCodeID=15 

替代(其是較不優選)是動態生成的SQL語句,然後使用EXEC來運行它。當然,主要的問題是SQL注入。

+0

是的,但是因爲我有N個郵政編碼ID,我不能像這樣使用它....你知道還有其他解決辦法嗎? –

+1

不是'p.ZipCodeID = 14或者p.ZipCodeID = 15'是否等同於'p.ZipCodeID IN(14,15)'? – NullUserException

+0

我懇請問一個關於如何動態地執行這個操作的鏈接或例子,如你所說... –

0

你能做DECLARE @ZipCodeIDS TABLE(id INT NOT NULL PRIMARY KEY)然後加入這個表嗎?

+0

那麼,我已經有了這張桌子......而且我加入了當然基於該桌子用戶選擇了哪些ID ...使用複選框.. –

0
AND (@ZipCodeIDS IS NULL OR p.ZipCodeID IN (select z.ID from @ZipCodeIDS)) 

幽州SQL沒有 「陣列」,但一切都在臺工作。與整型創建臨時表或表變量,並與您zipcodeIDs填充

declare @ZipCodeIDs = TABLE (ID int NOT NULL) 

填充@ZipCodeIDs

然後用你的代碼之前

如果您正試圖通過從一個數組你的 。net代碼到數據庫,您可以使用SQL Server 2008中的用戶定義表類型執行此操作。