在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')
;即类似于如何将滤波器应用于当前路径的上下文中的多个元素;但是还没有找到如何写(假设这是可能的)。
答案 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测试)