您可以这样做:
DECLARE @t TABLE(id int, n VARCHAr(50))INSERT INTO @t VALUES(1, 'ABCDEF'),(2, 'EFGHIJKLMNOPQ');WITH cte AS(SELECt id, n, SUBSTRINg(n, 1, 1) c, 1 AS ind FROM @t UNIOn ALL SELECt id, n, SUBSTRINg(n, ind + 1, 1), ind + 1 FROM cte WHERe LEN(n) > ind)SELECt *FROM cte PIVOT (MAX(c) FOR ind IN([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[12],[13],[14],[15])) p
输出:
id n 1 2 3 4 5 6 7 8 9 10 12 13 14 151 ABCDEF A B C D E F NULL NULL NULL NULL NULL NULL NULL NULL2 EFGHIJKLMNOPQ E F G H I J K L M N P Q NULL NULL
这是动态版本:
DECLARE @l INT, @c VARCHAr(MAX) = ''SELECt @l = MAX(LEN(n)) FROM PivotTableWHILE @l > 0BEGIN SET @c = ',[' + CAST(@l AS VARCHAr(MAX)) + ']' + @c SET @l = @l - 1ENDSET @c = STUFF(@c, 1, 1,'')DECLARE @s NVARCHAr(MAX) = ';WITH cte AS(SELECt id, n, SUBSTRINg(n, 1, 1) c, 1 AS ind FROM PivotTable UNIOn ALL SELECt id, n, SUBSTRINg(n, ind + 1, 1), ind + 1 FROM cte WHERe LEN(n) > ind)SELECt *FROM cte PIVOT (MAX(c) FOR ind IN(' + @c + ')) p'EXEC (@s)


