И еще один подход; -)
DECLARE @str VARCHAR(100)='123x758v961j';
WITH Tally(Nmbr) AS
(
SELECT TOP(LEN(@str)) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM master..spt_values
)
SELECT TRIM(
(
SELECT ' ' + SUBSTRING(@str,Nmbr,1)
FROM Tally
ORDER BY Nmbr
FOR XML PATH('')
)
);
Идея состоит в том, чтобы использовать подсчет на лету (список чисел для каждой позиции в пределах @str
) для чтения символов один за другим . Эта производная таблица воссоединена.
И - просто для удовольствия - продемонстрировать ряд подходов, еще один с использованием необычного обновления (чего-то, чего на самом деле следует избегать ;-))
WITH Tally(Nmbr) AS
(
SELECT TOP(LEN(@str)) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM master..spt_values
)
SELECT @str=STUFF(@str,Nmbr,0,' ')
FROM Tally
ORDER BY Nmbr DESC;
SELECT @str;