最近我被SQL Server的xml所震撼,但这里的这个让我疯了
DECLARE @xml XML;
SET @xml = '
<ROOT>
<Object>
<FooProperty1>123</FooProperty1>
<FooProperty2>456</FooProperty2>
</Object>
<Object>
<FooProperty1>123</FooProperty1>
<FooProperty2>456</FooProperty2>
</Object>
</ROOT>
';
SELECT [doc].[FooProperty1].value('.', 'INT') AS [fooProperty1],
[doc].[FooProperty2].value('.', 'INT') AS [fooProperty2]
FROM @xml.nodes('/ROOT/Object')
AS [doc]
(
[FooProperty1],
[FooProperty2]
)
给我
Msg 8159,Level 16,State 1,Line 22 'doc'的列数少于 在列列表中指定。
如果我将更改@xml
更改为
SET @xml = '
<ROOT>
<Object FooProperty1="123" FooProperty2="456"/>
<Object FooProperty1="123" FooProperty2="456"/>
</ROOT>
';
答案 0 :(得分:3)
我认为你的XQuery不正确 - 试试这个:
SELECT
Root.Obj.value('(FooProperty1)[1]', 'INT') AS [fooProperty1],
Root.Obj.value('(FooProperty2)[1]', 'INT') AS [fooProperty2]
FROM
@xml.nodes('/ROOT/Object') AS Root(Obj)
@xml.nodes()
定义XML片段 - 一个用于XPath中的每个条目 - 您需要为具有单个列的伪表分配一个双标识符别名(格式:Root(Obj)
) 。该伪表的那一列是XPath查询从XML文档中选择的XML片段。
基于该别名,您可以访问这些XML片段并提取各种属性。
第二个XML的更新,使用XML属性,请改用:
SELECT
Root.Obj.value('(@FooProperty1)[1]', 'INT') AS [fooProperty1],
Root.Obj.value('(@FooProperty2)[1]', 'INT') AS [fooProperty2]
FROM
@xml.nodes('/ROOT/Object') AS Root(Obj)
通过指定@FooProperty1
,您正在抓取XML 属性,而不是您当前正在查看的<ROOT>/<Object>
节点中的XML子元素。