2011-08-12 9 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にSINGLE IDが含まれていると完全に動作しますが、複数のID(例:「14,15」)を送信しようとすると、エラーが発生します....

手掛かりはありますか?

シモンズ:私たちは、T-SQLの配列を持っていないので、もちろん、私は...

UPDATEを@ZIpCodeIDSのvarchar型を作った:私は直接クエリでハードコーディング場合:IN (14,11)それは完璧に動作...ので何とかI私のコードから複数の値のためにこのパラメータを正しく送っていないと思います。 "、"区切り記号として表示されません。

UPDATE 2:リストを分割してIDをテーブルに入れようとしました。 zipCodeIDSにidが1つしかない場合、クエリは完全に機能します。複数の人のために、そうではありません...あなたは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

はい、私はあなたのテキストをいくつかのIDに分割し、それらとテンポラリテーブルを移入する厄介なSQLを作った –

+0

あなたは知っていますか、この一時テーブルの値を表示する方法はありますか?あなたのコードが動作していなくても、テーブルに分割された値が正しく挿入されていることを確認したいと思っていた... –

2

INのように使用することはできません。あなたの例では、郵便番号が'14,15 'に等しいp.ZipCodeIDを検索しようとしています。

代わりに、p.ZipCodeIDととを比較する必要があります。それぞれ郵便番号が必要です。

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

(あまり好ましくない)の代替は、動的SQL文を生成し、それを実行するためにEXECを使用することです。もちろん、その主な問題はSQLインジェクションです。

+0

ええ、私はN個の郵便番号を持っているので、このように使うことはできません。他の回避策は分かっていますか? –

+1

'p.ZipCodeID = 14 OR 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は何の "アレイ" を持っていませんが、すべてがセットで動作することを述べます。

が、その後

はあなたがから配列を渡すしようとしている場合は前のようにコードを使用するint型で

declare @ZipCodeIDs = TABLE (ID int NOT NULL) 

フィル@ZipCodeIDsを一時テーブルまたはテーブル変数を作成し、zipcodeIDsでそれを埋めますきみの 。SQL Server 2008のユーザー定義のテーブル型でこれを行うことができます。