源表 A 查詢出單行:ID=1001, str=3。需拆分為目標表 B 三行:(1001,1), (1001,1), (1001,1)。
CREATE PROC dbo.SplitValueToRows
@SourceTable NVARCHAR(128),
@TargetTable NVARCHAR(128)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL NVARCHAR(MAX);
-- 使用遞歸 CTE 生成數字序列 1..str
SET @SQL = N'
WITH nums AS (
SELECT 1 AS n
UNION ALL
SELECT n+1 FROM nums WHERE n < (SELECT MAX(str) FROM ' + QUOTENAME(@SourceTable) + N')
)
INSERT INTO ' + QUOTENAME(@TargetTable) + N' (ID, str)
SELECT s.ID, 1
FROM ' + QUOTENAME(@SourceTable) + N' s
JOIN nums n ON n.n <= s.str
OPTION (MAXRECURSION 0);';
EXEC sp_executesql @SQL;
END
str 次行。存儲過程方案性能最優、邏輯集中、易維護,是 ETL 拆分行的標準做法。