T-SQL で物事を分割/連絡する最も速い方法は、XML を使用することだと思います。これが私が使用した解決策です:
;WITH CTE(PromotionID,Codes)
AS
(
SELECT PromotionID
,CAST(N'<r><![CDATA[' + REPLACE(Codes, ',', ']]></r><r><![CDATA[') + ']]></r>' AS XML) AS Codes
FROM @SourceTable
)
SELECT PromotionID
,Code
FROM CTE
CROSS APPLY (SELECT DISTINCT RTRIM(LTRIM(Tbl.Col.value('.', 'nvarchar(250)'))) AS Code FROM Codes.nodes('//r') Tbl(Col)) AS List
Common Table Expression を使用して、コードを XML としてキャストしました。次に、一般的な方法で XML を個々の要素に分割しています。完全な動作例は次のとおりです。
SET NOCOUNT ON
GO
DECLARE @SourceTable TABLE
(
PromotionID INT,
Codes NVARCHAR(20)
)
INSERT INTO @SourceTable (PromotionID,Codes)
VALUES (1,'a,b')
,(2,'c')
,(3,'d,e,f')
;WITH CTE(PromotionID,Codes)
AS
(
SELECT PromotionID
,CAST(N'<r><![CDATA[' + REPLACE(Codes, ',', ']]></r><r><![CDATA[') + ']]></r>' AS XML) AS Codes
FROM @SourceTable
)
SELECT PromotionID
,Code
FROM CTE
CROSS APPLY (SELECT DISTINCT RTRIM(LTRIM(Tbl.Col.value('.', 'nvarchar(250)'))) AS Code FROM Codes.nodes('//r') Tbl(Col)) AS List
SET NOCOUNT OFF
GO