交叉申请以使用“节点”创建新行

时间:2019-07-12 01:20:52

标签: sql-server xml tsql split xquery

每个字段(我们将其称为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 个答案:

答案 0 :(得分:1)

我认为您必须对此进行更改

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或更高版本,建议阅读this answer的JSON部分。现在有更好的分割字符串的方法...