【问题标题】:SQL Server XQuery error: A node or set of nodes is required for number()SQL Server XQuery 错误:number() 需要一个节点或一组节点
【发布时间】:2014-10-03 16:03:35
【问题描述】:

我在 SQL Server 2012 中有以下查询:

DECLARE @xml XML

SET @xml =
'<Root>
    <Value>false</Value>
</Root>'

SELECT
    node.value('concat(substring("T", 1, number((./Value/text())[1] = "true")), substring("F", 1, number(not((./Value/text())[1] = "true"))))', 'NVARCHAR(MAX)') AS [ValueTF]
FROM @xml.nodes('/Root') AS input(node)

这是使用导出三元样式操作的方法,如下所述:How to create an if-then-else expression (aka ternary operator) in an XPath 1.0 expression?

我希望此查询为 ValueTF 返回 F,但它会给出以下错误消息:

消息 2374,第 16 级,状态 1,第 10 行
XQuery [value()]: number() 需要一个节点或一组节点

即使是简化的 XPath number((./Value/text())[1] = "true") 也会返回相同的错误。 Google 搜索“number() 需要一个节点或一组节点”不会返回任何结果。查询成功执行并在其他地方执行时按预期返回F,例如this online XPath tester

以下查询确实按预期返回Valuefalse,所以我知道至少查询的那部分工作正常:

DECLARE @xml XML

SET @xml =
'<Root>
    <Value>false</Value>
</Root>'

SELECT
    node.value('(./Value/text())[1]', 'NVARCHAR(MAX)') AS [Value]
FROM @xml.nodes('/Root') AS input(node)

W3 spec for the number function 似乎表明xs:anyAtomicType 可以作为参数传递给number,其中包括xs:boolean。那么,是我的代码有错误还是 SQL Server 的 XQuery 实现存在差异?

【问题讨论】:

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


    【解决方案1】:

    和你一样,我不知道为什么 SQL Server 的number() 实现不接受布尔参数...甚至字符串,显然!这很奇怪。

    尽管如此,如果它们支持 XQuery,那么它们应该按照定义支持 XPath 2.0,这意味着您无需使用这种丑陋的concat() 变通方法来模拟三元条件运算符:XPath 2.0 拥有真实的东西!

    所以不是

    'concat(substring("T", 1, number((./Value/text())[1] = "true")),
           substring("F", 1, number(not((./Value/text())[1] = "true"))))'
    

    你应该会说

    'if ((./Value/text())[1] = "true") then "T" else "F"'
    

    我还没有在 SQL Server 2012 中测试过它,但它是 XQuery 的一部分,并且记录在 here 中,因此值得一试。

    【讨论】:

    • 这确实适用于 SQL Server 2012,谢谢!我不知道为什么我的印象是我被限制在 XPath 1.0 中。
    【解决方案2】:

    经过更多研究,我发现以下页面描述了 SQL Server 2012 中 number() 的实现细节:number Function (XQuery)。从实施限制部分下的该页面:

    number() 函数只接受节点。它不接受原子值。

    因此,问题似乎在于number() 的 SQL Server 实现不会采用布尔参数,尽管我不清楚为什么它会以这种方式受到限制。

    【讨论】:

      猜你喜欢
      • 2021-10-30
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多