Faking Arrays in Transact SQLの記事では、PARSENAME() 関数 (5 項目に制限) の使用から CLR 関数の記述まで、この問題を解決するためのいくつかの手法について詳しく説明しています。
XML の回答は、特定のシナリオに合わせて選択できる詳細な手法の 1 つです。
いくつかのヒントを組み合わせて、次のように文字列分割の問題を解決しました。
SET NOCOUNT ON;
DECLARE @p NVARCHAR(1000), @len INT;
SET @p = N'value 1,value 2,value 3,value 4,etc';
SET @p = ',' + @p + ',';
SET @len = LEN(@p);
-- Remove this table variable creation if you have a permanent enumeration table
DECLARE @nums TABLE (n int);
INSERT INTO @nums (n)
SELECT A.n FROM
(SELECT TOP 1000 ROW_NUMBER() OVER (ORDER BY TableKey) as n FROM dbo.Table) A
WHERE A.n BETWEEN 1 AND @len;
SELECT SUBSTRING(@p , n + 1, CHARINDEX( ',', @p, n + 1 ) - n - 1 ) AS "value"
FROM @nums
WHERE SUBSTRING( @p, n, 1 ) = ',' AND n < @len;
文字列の長さの制限が 1000 であることを考慮すると、このサンプルのテーブル変数 @nums を作成するには、1000 行以上のテーブル (サンプル tsql の dbo.Table) が必要であることに注意してください。記事には、永続的な列挙表があります。