我有一个标量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*>
元素。
答案 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" />