如何使用xquery拆分xml变量?

时间:2012-04-30 19:22:18

标签: sql-server tsql sql-server-2005 xquery

我有一个标量xml变量:

DECLARED @XML xml =
'<rows>
    <row>
        <column1 attrib="" />
        <column2 attrib="" />
    </row>
    <!-- ... -->
</rows>';

我想拆分数据,以便将每行的xml分配给表中的新记录:

Id | ... | XML
1  |     | '<row><column1 attrib="" /><column2 attrib="" /></row>'
2  |     | etc.
3  |     | etc.

我还没有完全掌握xquery所以我在编写一个执行我想要的插入语句时遇到了麻烦。

INSERT into MyTable( [XML])
SELECT @XML.query('row')

现在我知道正在发生某事,但它似乎并没有按照我的意图行事,而是插入多条新记录,它将一个带有空字符串的记录插入[XML]列。< / p>

我没有得到什么?

澄清

我不是想使用value(...)从每行获取内部文本,子元素或属性。我正在尝试捕获整个<row>元素并将其保存到xml类型的列

我已尝试nodes(...)并提出:

INSERT into MyTable([XML])
SELECT C.query('*')
FROM @XML.nodes('rows/row') T(C)

哪个更接近我想要的但结果不包括外部<row>标记,只包含它包含的<column*>元素。

2 个答案:

答案 0 :(得分:1)

您需要使用.nodes(...)将每个<row .../>投影为一行,然后使用.value(...)提取感兴趣的属性。类似的东西:

insert into MyTable(XML)
select x.value('text()', 'nvarchar(max)') as XML
from @XML.nodes(N'/rows/row') t(x);

text()将选择每个<row .../>的内部文字。您应该使用适当的表达式(例如。node()@attribute等,请参阅XPath examples),具体取决于您对该行的要求(您的示例根本没有明确说明,所有那些空元素......)。

答案 1 :(得分:0)

T-SQL脚本:

SET ANSI_WARNINGS ON;

DECLARE @x XML =
'<rows>
    <row Atr1="11" />
    <row Atr1="22" Atr2="B" />
    <row Atr1="33" Atr2="C" />
</rows>';

DECLARE @Table TABLE(Id INT NOT NULL, [XMLColumn] XML NOT NULL);

INSERT  @Table (Id, XMLColumn)
SELECT  ROW_NUMBER() OVER(ORDER BY @@SPID) AS Id,
        a.b.query('.') AS [XML]
FROM    @x.nodes('//rows/row') AS a(b);

SELECT  *
FROM    @Table t;

结果:

Id XMLColumn
-- --------------------------
1  <row Atr1="11" />
2  <row Atr1="22" Atr2="B" />
3  <row Atr1="33" Atr2="C" />