4

SQL IN演算子を使用して一致するIDのリストを検索して返すために、ストアドプロシージャを使用する際にいくつかの問題が発生しています。私が思う問題はデータ型に関連しています。

パラメータは文字列'32,1,5,78,43'としてストアドプロシージャに渡されます-これは、フィールドColumn1を検索するためにIN演算子としてクエリに渡される必要があります。Bigintのこのフィールドのデータ型。

DECLARE @TEST varchar(1000)
SET @TEST = REPLACE('32,1,5,78,43', '''','')

SELECT Column1, Column2 
FROM Table
WHERE Column1 IN(@TEST)

文字列から引用符を削除しようとしても機能しないようで、「データ型varcharからbigintへの変換中にエラーが発生しました」というエラーが返されます。

ストアドプロシージャなしでコードを実行し、値を直接IN演算子(引用符なし)に入れると、正しく機能し、正しい値が返されます。例えば

SELECT Column1, Column2 
FROM Table
WHERE Column1 IN(32,1,5,78,43)

私がここでどこが間違っているのか誰かにアドバイスしてもらえますか?

4

4 に答える 4

7

または、これに動的SQLを使用することもできます。

DECLARE @TEST varchar(1000)
DECLARE @SQLQuery AS NVARCHAR(500)

SET @TEST = '32,1,5,78,43'

SET @SQLQuery = 'SELECT Column1, Column2 FROM Table WHERE Column1 IN('+ @TEST +')'
EXECUTE(@SQLQuery)
于 2013-03-25T13:17:14.587 に答える
3

文字列リスト内の整数テストを作成する1つの実用的な方法は、次のとおりです。

DECLARE @TEST varchar(1000)
SET @TEST = '32,1,5,78,43'

SELECT Column1, Column2 
FROM Table
WHERE ',' + @TEST + ',' LIKE '%,' + cast(Column1 as varchar(16)) + ',%'

より良い方法は、テーブル値パラメーターを使用して、厳密に型指定された整数のリストをストアード・プロシージャーに渡すことです。

于 2013-03-25T13:16:46.063 に答える
2

したがって、動的SQLを使用する必要がありますが、ケースで一重引用符をエスケープする必要はありません。次のようにしてください。

declare @sql varchar(max)
set @sql = 'Select Column1, Column2 from Table where Column1 in (' + @test + ')'
execute (@sql)
于 2013-03-25T13:20:29.597 に答える
1

Split関数を使用して、コンマ区切りの文字列を一時テーブルに分割し、それに結合することができます。

文字列を分割するコードの良い例を次に示します 。T-SQL:文字列の連結の反対-文字列を複数のレコードに分割する方法

動的SQLを実行することもできますが、それは一般的に最適ではありません。

于 2013-03-25T13:22:40.793 に答える