【发布时间】: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。
以下查询确实按预期返回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 spec for the number function 似乎表明xs:anyAtomicType 可以作为参数传递给number,其中包括xs:boolean。那么,是我的代码有错误还是 SQL Server 的 XQuery 实现存在差异?
【问题讨论】:
标签: sql sql-server xpath sql-server-2012 xquery