Еще одно решение с использованием позиции и +1
:
DECLARE @String VARCHAR(MAX) = 'A->B->C->D->E';
DECLARE @YourStringAsXml XML=CAST('<x>' + REPLACE(@String, '->', '</x><x>') + '</x>' AS XML);
- запрос
WITH tally(nr) AS
(
SELECT TOP (@YourStringAsXml.value('count(/x)','int')) ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
FROM master..spt_values
)
SELECT @YourStringAsXml.value('/x[sql:column("nr")][1]','varchar(10)') AS FromNode
,@YourStringAsXml.value('/x[sql:column("nr")+1][1]','varchar(10)') AS ToNode
FROM tally;
Идея вкратце:
- Мы преобразуем строку в XML
- Мы используем tally-on-the-fly с вычисленным предложением
TOP()
, чтобы получить список бегущих чисел (лучше было - и в любом случае очень красивый - таблица числовых чисел). - Теперь мы можем выбрать элементы по их положению (
sql:column()
) и соседу, просто добавив +1 к этой позиции