1

我有一个标量 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]列中。

我没有得到什么?

澄清

我不是试图使用value(...). 我正在尝试捕获整个<row>元素并将其保存到类型的列中xml

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

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

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

4

2 回答 2

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 示例),具体取决于您想要从行中获得的内容(您的示例根本没有说清楚,所有这些空元素......)。

于 2012-04-30T19:30:44.757 回答
0

T-SQL Script:

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;

Results:

Id XMLColumn
-- --------------------------
1  <row Atr1="11" />
2  <row Atr1="22" Atr2="B" />
3  <row Atr1="33" Atr2="C" />
于 2012-04-30T20:05:27.390 回答