这里有一个问题(How to update all xml attributes' value in an xml variable using t-sql?),提问者想要将xml变量拆分成行。
我有几乎相同的问题,但我将xmls存储在一个表中。每行至少存储1个xml节点,有时甚至更多。我想将它们分成不同的行,但似乎.nodes('a')需要一个标量变量。
这是我尝试过的:
declare @T table (XMLCol xml);
insert into @T values
('<a abb="122">
<b></b>
</a>
<a abb="144">
<b></b>
</a>'),
('<a abb="222">
<b></b>
</a>
<a abb="244">
<b></b>
</a>');
select a.query('.') from @T.nodes('a') a(a);
我想要实现的目标: 我有一张这样的桌子:
ID XML
1 <a abb="122"><b></b></a><a abb="144"><b></b></a>
2 <a abb="222"><b></b></a><a abb="244"><b></b></a>
我想把它转换成类似的东西:
ID XML
1 <a abb="122"><b></b></a>
2 <a abb="144"><b></b></a>
3 <a abb="222"><b></b></a>
4 <a abb="244"><b></b></a>
为此,我想写一些像简单的
一样的东西INSERT INTO table2 SELECT * FROM table1
你能帮我吗?
提前致谢!
答案 0 :(得分:5)
尝试这样(如果我理解你的问题):
declare @xml xml = N'<a abb="122"><b></b></a><a abb="144"><b></b></a>'
select @xml.query('/a/*')
如果您希望每个b节点显示为行,请使用:
select x.items.query('.') from @xml.nodes('/a/b') as x(items)
编辑: 您可以从表变量中获取数据:
select tbl.vals
from @T as t
cross apply (select x.items.query('.') from t.XMLCol.nodes('/a') as x(items)) as tbl(vals)