繁体   English   中英

SQL Server XQuery错误:number()需要一个节点或一组节点

[英]SQL Server XQuery error: A node or set of nodes is required for number()

我在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)

这是使用如下所述的派生三元式操作的方法: 如何在XPath 1.0表达式中创建if-then-else表达式(也称为三元运算符)?

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

Msg 2374,Level 16,State 1,Line 10
XQuery [value()]:number()需要一个节点或一组节点

即使简化的XPath number((./Value/text())[1] = "true")也会返回相同的错误。 Google搜索“数字()需要节点或节点集”不会返回任何结果。 查询成功执行并在其他地方执行时按预期返回F ,例如在此在线XPath测试程序中

以下查询确实为Value返回false ,因此我知道至少该部分查询正常工作:

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规范似乎表明xs:anyAtomicType可以作为参数传递给number ,其中包括xs:boolean 那么,我的代码中是否存在错误,或者这是SQL Server XQuery实现的差异?

经过一番研究后,我遇到了以下页面,它描述了SQL Server 2012中number()的实现细节: number Function(XQuery) 从“实施限制”部分下的该页面:

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

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

和你一样,我不知道为什么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的一部分,并且它在此处记录 ,所以值得一试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM