Мое предложение было следующим:
A таблица макетов для имитации вашей проблемы
DECLARE @tbl TABLE(ID INT IDENTITY, YourString VARCHAR(250));
INSERT INTO @tbl VALUES('10273955=1|10142823=5|10664263=10|10134335=3|10046639=3|10334724=25|10334725=100');
- Запрос
SELECT t.ID
,t.YourString
,A.CastedToXml
,REPLACE(A.CastedToXml.query('data(/x/y[1])').value('.','varchar(150)'),' ','|')
FROM @tbl t
CROSS APPLY(SELECT CAST('<x><y>' + REPLACE(REPLACE(t.YourString,'|','</y></x><x><y>'),'=','</y><y>') + '</y></x>' AS XML)) A(CastedToXml);
результат
10273955|10142823|10664263|10134335|10046639|10334724|10334725
Идея вкратце:
APPLY
будет использовать некоторые замены для преобразования двойного XML-кода за один раз. Это будет выглядеть так:
<x>
<y>10273955</y>
<y>1</y>
</x>
<x>
<y>10142823</y>
<y>5</y>
</x>
<x>
<y>10664263</y>
<y>10</y>
</x>
<x>
<y>10134335</y>
<y>3</y>
</x>
<x>
<y>10046639</y>
<y>3</y>
</x>
<x>
<y>10334724</y>
<y>25</y>
</x>
<x>
<y>10334725</y>
<y>100</y>
</x>
Хитрость заключается в использовании data()
XQuery, который возвращает все значения в XPath в виде пробел отдельных фрагментов. Использование XPath /x/y[1]
говорит движку: Выберите каждый <x>
и первый <y>
, который вы там найдете! .
Кстати: в XMLпорядок сортировки исправлен. Таким образом, возвращаемая строка не изменит этот порядок.