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

SQL Server XQuery错误:number()需要一个节点或一组节点,sql,sql-server,xpath,sql-server-2012,xquery,Sql,Sql Server,Xpath,Sql Server 2012,Xquery,我在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

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

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

经过进一步研究,我看到了下面一页,描述了SQL Server 2012中
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的一部分,并且有文档记录,因此值得一试。

这在SQL Server 2012中确实有效,谢谢!我不知道为什么会有这样的印象,我被限制在XPath1.0上。
'if ((./Value/text())[1] = "true") then "T" else "F"'