2016-09-06 24 views
1

私は全く新しいSQLです。勉強しているうちに私は以下の問題を見つけました。In()演算子が機能しない

クエリを実行すると、出力は125,130,131になります。私はその出力を変数@issueidに保存しています。

declare @issueid varchar(100) 

set @issueid = (
    SELECT STUFF(
      (
       SELECT ','+convert(varchar,ism_id) 
       FROM table where ism_group_name='TEST_COPY' 
       FOR XML PATH('') 
      ) ,1,1,'')) 

しかし、私は、クエリ以下で@issueid変数を使用するとき、私は奇妙な動作を取得:

  • 私は@issueid='125'を渡すと私は@issueid='125,130,131'を渡すと、それは何も出力を示していない結果
  • を取得します。

マイクエリ:

SELECT * 
FROM 
    ISSUE_MASTER (NOLOCK), 
    ORDER_ENTRY_PPDI (NOLOCK) 
WHERE ISM_ID= OE_ISSUE_ID 
    and ism_id=oe_issue_id 
    and convert(varchar,oe_issue_id) in (@issueid) 
    AND ISM_STATUS = 0 
GROUP BY ISM_ISSUER_NAME,ISM_ISSUE_NAME,OE_ISSUE_ID 

助けてください!私が間違っていることは何ですか?

+2

Integerデータ型のために最後に使用したい場合に整数値を文字列として連結するのはなぜですか?代わりに、テーブル変数を使用して課題IDを取得し、それを2番目のクエリで使用します。 –

+1

変数 '@ issueid'はあなたが提供したクエリ以外の場所に必要ですか?そうでなければ、変数に値を格納するのではなく、テーブル 'table'に直接結合します。 – Aquillo

答えて

1

この特定の問題に対して動的SQLを使用できますが、@Aquilloはそれが良い方法ではないとコメントしました。カンマ区切りのパラメータを加えることなく、あなたが必要なテーブルで最初のテーブルに参加した方がよい:

SELECT im.*, 
     oe.* 
FROM ISSUE_MASTER im (NOLOCK), 
INNER JOIN ORDER_ENTRY_PPDI oe (NOLOCK) 
    ON im.ISM_ID= oe.OE_ISSUE_ID 
INNER JOIN [table] t 
    ON oe.oe_issue_id = t.ism_id 
WHERE ISM_STATUS = 0 
    AND ism_group_name='TEST_COPY' 
GROUP BY ISM_ISSUER_NAME,ISM_ISSUE_NAME,OE_ISSUE_ID 

別の解決策は、XMLの助けを借りて、テーブルに@issueidを翻訳し、最終的には、それに参加することである。

DECLARE @x xml 

SELECT @x = CAST('<v>'+REPLACE(@issueid,',','</v><v>')+'</v>' as xml) 

SELECT im.*, 
     oe.* 
FROM ISSUE_MASTER im (NOLOCK), 
INNER JOIN ORDER_ENTRY_PPDI oe (NOLOCK) 
    ON im.ISM_ID= oe.OE_ISSUE_ID 
INNER JOIN (
     SELECT t.v.value('.','int') as ism_id 
     FROM @x.nodes('/v') as t(v) 
    ) t 
    ON oe.oe_issue_id = t.ism_id 
WHERE ISM_STATUS = 0 
    AND ism_group_name='TEST_COPY' 
GROUP BY ISM_ISSUER_NAME,ISM_ISSUE_NAME,OE_ISSUE_ID 

動的SQL:

DECLARE @sql nvarchar(max) 

@sql = N' 
SELECT * 
FROM ISSUE_MASTER im (NOLOCK), 
INNER JOIN ORDER_ENTRY_PPDI oe (NOLOCK) 
    ONim.ISM_ID= oe.OE_ISSUE_ID 
WHERE convert(varchar,oe_issue_id) in ('[email protected]+') 
    AND ISM_STATUS = 0 
GROUP BY ISM_ISSUER_NAME,ISM_ISSUE_NAME,OE_ISSUE_ID' 

EXEC sp_executesql @sql 

注:新しいスタイルの結合を使用してエイリアスを使用します。

+0

これはうまくいくが、そのアプローチは、与えられた問題に対処する最良の方法ではない。私は結果の文字列内の単一の値を検索するためだけに複数の値をimplopeするOPをお勧めしません。 – Aquillo

+0

@Aquilloカンマで区切ったパラメータを作成せずに、最初のテーブルをターゲットテーブルに結合する方が良いです。あるいはOPは '@ issueid'をxmlの助けを借りてテーブルに変換し、それに参加することができます。 – gofr1

+0

まさにそれが私の言いたいことです。あなたがOPの質問に対する答えを与えたにもかかわらず、OPで選択された「間違った」アプローチの問題があります。 – Aquillo

関連する問題