2016-07-01 12 views
1

を使用して、クエリ、私は次のクエリを持っている:SQL - XMLパス

SELECT  ara.req_id 
FROM  tbl_ara ara 
WHERE  id in (
         SELECT STUFF((
         SELECT ',' + cast(id as varchar(8000)) 
         FROM contact 
         WHERE ct_id = 2 
         FOR XML PATH('') 
         ), 1, 1, '')) 

だから、私は彼らが2の一種であるとき、すべてのidsを取得したい名前contactを持つテーブルには、theresのです。それから私はスタッフとリストを作成しています。 次に、別のテーブルを使用して、そのリストにあるidのすべてのレコードを取得します。 クエリ内のロジックを確認できます。 問題はSQLがリストとしてそれを認識しないと、私は次のエラーを取得することです:

Msg 245, Level 16, State 1, Line 11 Conversion failed when converting the nvarchar value '6019,49111,49112' to data type int.

答えて

3

STUFFあなたの場合は、文字データを返します。ドキュメント(https://msdn.microsoft.com/en-us/library/ms188043.aspx)から:

Returns character data if character_expression is one of the supported character data types. Returns binary data if character_expression is one of the supported binary data types.

だから、IDのリストではなく、数字とカンマを含む文字列を得ることはありません。

IDを直接使用しない理由はありますか?

SELECT 
    [ara].[req_id] 
FROM [tbl_ara] [ara] 
WHERE [id] IN 
      (
       SELECT 
        [id] 
       FROM [contact] 
       WHERE [ct_id] = 2 
      ) 

EDIT:もちろん@ gofr1によってJOINソリューションは、あまりにも、かなり良いオプションです。

+0

はい理由があります。私はSQLを使用した最後の時間以来、しばらくお待ちしております:)ありがとう – BlackM

2

最も簡単な方法は、JOINです:

SELECT ara.req_id 
FROM tbl_ara ara 
INNER JOIN contact c 
    ON ara.id = c.id 
WHERE c.ct_id = 2 

あなたがSTUFFを使用して実行したい場合は、あなたがすべき動的SQLを使用します。最初にそれを実行して、ステートメントを準備します

DECLARE @sql nvarchar(max), @inpart nvarchar(max) 

SELECT @inpart = STUFF((
        SELECT ',' + cast(id as varchar(8000)) 
        FROM contact 
        WHERE ct_id = 2 
        FOR XML PATH('') 
        ), 1, 1, '') 


SELECT @sql = ' 
SELECT  ara.req_id 
FROM  tbl_ara ara 
WHERE  id in (' + @inpart+ ')' 


PRINT @sql 

--EXEC sp_executesql @sql 

PRINTあなたにこれを取得します:

SELECT  ara.req_id 
FROM  tbl_ara ara 
WHERE  id in (6019,49111,49112) 

コメントを解除EXEC sp_executesql @sqlクエリを実行します。

1

なぜあなたはこれを試してみません:句は、単一のマッチの有無をチェックし、一致するものが見つかったときに、その行を返す存在

SELECT ara.req_id 
FROM tbl_ara As ara 
WHERE Exists(Select 1 
       From contact As c 
       Where c.ct_id = 2 
         And c.id = ara.id 
      ) 

通り。