Это то, что вы имеете в виду?
WITH X AS
(
SELECT 1 AS UserID,'ABC' AS ConcatField UNION ALL
SELECT 2 AS UserID,'DEF' AS ConcatField
), N AS
(SELECT 1 i
UNION ALL
SELECT i+1
FROM N
WHERE i<1000 /*Or whatever your max string length is*/
)
SELECT UserID,SUBSTRING(ConcatField,i,1) as ConcatField
INTO #NewTemporaryTable
FROM X JOIN N ON I<= LEN(ConcatField)
OPTION(MAXRECURSION 0)
Дает
UserID ConcatField
----------- -----------
1 A
1 B
1 C
2 D
2 E
2 F
Редактировать: Хотя, как отметил Джефф Моден в комментариях, производительность рекурсивных CTEэто далеко не так, так что вам лучше всего создать таблицу постоянных чисел, используя один из методов отсюда , а затем использовать
SELECT UserID ,
SUBSTRING(ConcatField, i, 1) AS ConcatField
INTO #NewTemporaryTable
FROM YourTable
JOIN Numbers ON Number <= LEN(ConcatField)