【问题标题】:SQL Server - Querying a XML Document for List of IDsSQL Server - 查询 XML 文档以获取 ID 列表
【发布时间】:2014-04-10 17:52:33
【问题描述】:

从该文档中提取 ID 列表作为整数的正确方法是什么?

    declare @d xml
    set @d = '<doc><id>1</id><id>2</id></doc>'

    select Data.Col.value('/text()', 'Int')
      from @d.nodes('/doc/id')
        as Data(Col)

使用上面的方法我得到一个错误 XQuery [value()]: 'value()' 需要一个单例(或空序列),找到类型为 'xdt:untypedAtomic *' 的操作数

【问题讨论】:

    标签: sql-server xpath sql-server-2012 sqlxml


    【解决方案1】:

    .value() 总是需要一个位置参考来识别你想要的节点。

    declare @d xml
    set @d = '<doc><id>1</id><id>2</id></doc>'
    
    select Data.Col.value('.[1]', 'Int')
      from @d.nodes('/doc/id')
        as Data(Col)
    

    【讨论】:

    • 在你的帖子之后,我尝试了同样的一个小改动 select Data.Col.value('.[text()]', 'Int') 它也有效。哪个更正确?我要追踪节点的文本值,而不是节点的第一个孩子,对吗?谢谢
    • 如前所述,两者都运行良好;但是,我认为在谓词中包含 text() 语句是在进行存在性检查,并返回第一个节点的值,而硬编码的 1 提供了一个特定的参考点。在此示例中,nodes() 方法已经将 XML 拆分为每行只有 1 个节点,因此 [1] 和 [text()] 都指向同一个位置。
    • 谢谢。很棒的答案。
    猜你喜欢
    • 2021-12-02
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 2013-08-18
    相关资源
    最近更新 更多