在 SQL XQuery 算法中使用相对路径

Using relative paths within SQL XQuery arithmetic

有没有简单的方法在 SQL 服务器的 XQuery 算法中使用相对路径?

例如使用以下代码,我在运算符的两侧重复 /a/b/

declare @x xml = '<a><b><x>10</x><y>20</y></b></a>'
select @x.value('((/a/b/x/text())[1] + (/a/b/y/text())[1])[1]','bigint')

更多信息

注意:我知道在上面的示例中我可以使用 SUM 函数......遗憾的是,这不适用于我的实际用例,在这些用例中,我有多个元素,在它们之间执行各种操作。

我也很熟悉 nodes 选项来执行如下操作:

select ab.b.value('((./x)[1] + (./y)[1])[1]','bigint')
from @x.nodes('/a/b') ab(b)

当 XML 来自列而不是变量时,我也熟悉使用 outer apply/cross apply 访问此类子查询。这是我目前正在走的路线,但感觉有点笨拙。

我正在想象一个与此类似的解决方案: select @x.value('(/a/b[(./x)[1] + (./y)[1]])[1]','bigint');即类似于过滤器如何应用于当前路径上下文中的多个元素;但还没有找到如何写(假设这是可能的)。

在大多数 XQuery 系统中,给定您的数据,您可以替换

'((/a/b/x/text())[1] + (/a/b/y/text())[1])[1]'

'/a/b/(x+y)'

但我相信 SQL 服务器实现有其自身的怪癖,因此这可能不适用于您的情况。如果您需要一种方法来绕过悲观类型检查,那么

/a/b/sum((x,y))

可能会成功。

declare @x xml
SET @x = '<a><b><x>10</x><y>20</y></b></a>'

select @x.query('
    for $i in /a/b
    return
        data($i/x[1]) + data($i/y[1])
')

如果路径太长而您想为其使用 "alias",则可以选择上述路径。它可能看起来更好一点?您可以将 + 替换为其他运算符,例如 -、* 等。 (使用 SQL 服务器 2005 测试)