Перекрестное применение для создания новых строк с «узлами» - PullRequest
0 голосов
/ 12 июля 2019

Каждое поле (назовем его field1) имеет связанную с ним строку (назовем его field2).Я хочу разделить field2, чтобы объединенное значение разбилось на несколько строк.Я использую «Узлы» для достижения этой цели, но постоянно получаю сообщение об ошибке.

Существуют и другие способы достижения этой цели, такие как разбиение строки на столбцы и разворот данных, но это громоздко.Этот метод кажется наиболее эффективным, но я не совсем знаю, как это сделать.

with xmll as ( 
select field1, cast('<r>'+replace(replace(field2,'Case #',''), ',', '</r> 
<r>')+'</r>' as xml) as XMLCol
from [database].dbo.table i
where field2 like 'Case%#%'
)

select x.*
, n.r.value('.', 'varchar(max)')
from xmll x

cross apply 
XMLCol.nodes(XMLCol) as n(r)

order by field1

Текущее сообщение об ошибке:

Msg 8172, Level 16, State 1, Line 1
The argument 1 of the XML data type method "nodes" must be a string literal.

Каково это сейчас:

enter image description here

Что я хочу:

enter image description here

1 Ответ

1 голос
/ 12 июля 2019

Я думаю, вы должны изменить это

cross apply 
XMLCol.nodes(XMLCol) as n(r)

на это

cross apply 
XMLCol.nodes('/r') as n(r)

Причина:

Ваш xml состоит из повторяющихся <r> элементов.Вы должны сообщить .nodes(), что вы хотите получить обратно.

Для SQL-Server 2016 +

Если у вас есть SQL-Server 2016 или более поздняя версия, я рекомендую прочитатьJSON-раздел этот ответ .Теперь есть намного лучшие подходы для разделения строки ...

...