tsql如何拆分xml并将它们作为行插入

Nan*_*dor 2 xml t-sql

这里有一个问题(如何使用t-sql更新xml变量中的所有xml属性的值?),其中提问者想要将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);
Run Code Online (Sandbox Code Playgroud)

我想要实现的目标:我有一个这样的表:

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>
Run Code Online (Sandbox Code Playgroud)

我想把它转换成这样的东西:

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>
Run Code Online (Sandbox Code Playgroud)

为此,我想写一些像简单的东西

INSERT INTO table2 SELECT * FROM table1
Run Code Online (Sandbox Code Playgroud)

你能帮我吗?

提前致谢!

Nem*_*vic 5

试试这样(如果我理解你的问题):

declare @xml xml = N'<a abb="122"><b></b></a><a abb="144"><b></b></a>'
select  @xml.query('/a/*') 
Run Code Online (Sandbox Code Playgroud)

如果希望每个b节点显示为行,请使用以下命令:

select x.items.query('.') from @xml.nodes('/a/b') as x(items) 
Run Code Online (Sandbox Code Playgroud)

编辑:您可以从表变量中获取数据,如下所示:

select tbl.vals
from @T as t
cross apply (select x.items.query('.') from t.XMLCol.nodes('/a') as x(items)) as tbl(vals)
Run Code Online (Sandbox Code Playgroud)