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

时间:2016-09-19 15:15:54

标签: sql-server-2008-r2 xquery xquery-sql

在SQL Server中有一种在XQuery算法中使用相对路径的简单方法吗?

e.g。使用下面的代码,我在运算符的两边重复/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');即类似于如何将滤波器应用于当前路径的上下文中的多个元素;但是还没有找到如何写(假设这是可能的)。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

可能会成功。

答案 1 :(得分:1)

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])
')

如果路径太长而您想使用&#34;别名&#34;对于它,以上可以是一个选项。它可能看起来更好一点?您可以使用其他运算符替换+,例如 - ,*等。 (使用SQL Server 2005测试)