関数や XML を必要としないトリックを次に示します。
基本的に、文字列は一時テーブルの単一の挿入ステートメントに変換されます。
一時テーブルは、その後の処理に使用できます。
IF OBJECT_ID('tempdb..#tmpNum') IS NOT NULL
DROP TABLE #tmpNum;
CREATE TABLE #tmpNum (num int);
DECLARE @TEXT varchar(max) = '1,17,25,44,46,67,88';
DECLARE @InsertStatement varchar(max);
SET @InsertStatement = 'insert into #tmpNum (num) values ('+REPLACE(@TEXT,',','),(')+');';
EXEC (@InsertStatement);
-- use the temp table
SELECT *
FROM YourTable t
WHERE t.id IN (SELECT DISTINCT num FROM #tmpNum);
このメソッドは、最大 1000 個の値に使用できます。
行値式の上限は 1000 であるためです。
また、スチュアート・エインズワースが指摘したように。
このメソッドは Dynamic Sql を使用するため、コード インジェクションに注意し、ユーザー入力に基づく文字列には使用しないでください。
サイドノート
MS Sql Server 2016 以降では、STRING_SPLIT関数を使用するだけで済みます。
DECLARE @TEXT varchar(max);
SET @TEXT = '1,17,25,44,46,67,88';
SELECT t.*
FROM YourTable t
JOIN (SELECT DISTINCT CAST(value AS INT) num FROM STRING_SPLIT(@TEXT, ',')) nums
ON t.id = nums.num;