Это можно выразить немного проще:
DECLARE @yourStr VARCHAR(MAX) = N'(<1002>+<1003>+<1004>+<1048>+<1049>+<1050>)/(<1400>*2)';
SELECT AllX.value('@z','int')
FROM (VALUES (CAST(REPLACE(REPLACE(@yourStr,'<','<x z="'),'>','" />') AS XML))) A(Casted)
CROSS APPLY A.Casted.nodes('/x') B(AllX);
Вот и все: -)
Идея вкратце:
Заменив <
и >
мы можем создать (не правильно сформированный) XML следующим образом:
(<x z="1002" />+<x z="1003" />+<x z="1004" />+<x z="1048" />+<x z="1049" />+<x z="1050" />)/(<x z="1400" />*2)
T- SQL может иметь дело с фрагментами , поэтому мы можем использовать .nodes('/x')
прочитать все элементы <x>
на уровне root. Любой другой контент - это просто шум между элементами, плавающий вокруг в text()
узлах, которые мы можем игнорировать.
Мы просто читаем z
-атрибут и возвращаем его как int
.