为什么SQL Server中的这个xml查询不起作用

时间:2011-01-04 08:02:14

标签: sql-server xml

最近我被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更改为

,则msg不会更改
SET @xml = '
    <ROOT>
        <Object FooProperty1="123" FooProperty2="456"/>
        <Object FooProperty1="123" FooProperty2="456"/>
    </ROOT>
';

1 个答案:

答案 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子元素。