これが機能しない理由は、@P1 が 1 つの単一の値として扱われるためです。
例えば@Code が X101,B202 の場合、クエリは次のように実行されます。一重引用符を含めた場合でも、RegionCode で検索する値にはそれらの一重引用符が含まれていることが期待されます。
考えているように機能させるには、@Code 変数を @Cmd sql コマンド テキストに実際に連結する必要があります。
SET @Code = '''X101'',''B202'''
SET @Cmd = 'SELECT * FROM Table WHERE RegionCode IN (' + @Code + ')'
EXECUTE (@Cmd)
ただし、明らかに、これは SQL インジェクションの可能性を広げるだけなので、このアプローチを採用した場合は、それを確実に防ぐために十分に注意する必要があります。
検索する値の動的リストを渡す場合、この状況に対処する別の方法があります。
私のブログの例を確認してください SQL Server 2005 で使用できる 2 つの方法があります。1 つは、「Value1,Value2,Value3」の形式で CSV リストを渡し、それをユーザー定義関数を使用して TABLE 変数に分割することです (これについては多くの言及があります)。このサイトをすばやくグーグルまたは検索すると、アプローチします)。分割したら、その TABLE 変数をメイン クエリに結合します。 2 番目の方法は、値を含む XML BLOB を渡し、SQL Server の組み込み XML 機能を使用することです。これらのアプローチは両方とも、そのリンクのパフォーマンス メトリックで実証されており、動的 SQL は必要ありません。
SQL Server 2008 を使用している場合は、テーブル値パラメーターが適しています。これは、そのリンクで示した 3 番目のアプローチであり、最も効果的です。