これを行う最も効率的な方法は、rt2800 言及などの動的 SQL を使用することです (Michael Allen によるインジェクション警告付き)。
ただし、関数を作成できます。
ALTER FUNCTION [dbo].[CSVStringsToTable_fn] ( @array VARCHAR(8000) )
RETURNS @Table TABLE ( value VARCHAR(100) )
AS
BEGIN
DECLARE @separator_position INTEGER,
@array_value VARCHAR(8000)
SET @array = @array + ','
WHILE PATINDEX('%,%', @array) <> 0
BEGIN
SELECT @separator_position = PATINDEX('%,%', @array)
SELECT @array_value = LEFT(@array, @separator_position - 1)
INSERT @Table
VALUES ( @array_value )
SELECT @array = STUFF(@array, 1, @separator_position, '')
END
RETURN
END
そしてそれから選択します:
DECLARE @LocationList VARCHAR(1000)
SET @LocationList = '1,32'
SELECT Locations
FROM table
WHERE LocationID IN ( SELECT *
FROM dbo.CSVStringsToTable_fn(@LocationList) )
また
SELECT Locations
FROM table loc
INNER JOIN dbo.CSVStringsToTable_fn(@LocationList) list
ON list.value = loc.LocationID
これは、SSRS から PROC に複数値リストを送信しようとするときに非常に役立ちます。