Sql server 2008 r2 在SQLXQuery算法中使用相对路径

Sql server 2008 r2 在SQLXQuery算法中使用相对路径,sql-server-2008-r2,xquery,xquery-sql,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') 当XML来自列而

有没有一种简单的方法可以在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')
当XML来自列而不是变量时,我还熟悉使用
外部应用
/
交叉应用
来访问这些子查询。这是我目前正在走的路线,但感觉有点笨重

我正在设想一个类似的解决方案:
选择@x.value('(/a/b[(/x)[1]+(/y)[1])[1],'bigint')
;i、 e.类似于如何将过滤器应用于当前路径上下文中的多个元素;但是还没有发现如何编写(假设这是可能的)。

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

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

但是我相信SQL server实现有它自己的怪癖,所以这可能不适用于您的情况。如果您需要一种绕过悲观类型检查的方法,那么

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

可能就可以了。

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

'((/a/b/x/text())[1] + (/a/b/y/text())[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])
')

但是我相信SQL server实现有它自己的怪癖,所以这可能不适用于您的情况。如果您需要一种绕过悲观类型检查的方法,那么

/a/b/sum((x,y))
也许可以做到这一点。

declare@xxml
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])
')
设置@x='1020' 选择@x.query(' a/b中的$i 返回 数据($i/x[1])+数据($i/y[1]) ')
如果路径太长,并且您希望为其使用“别名”,则可以选择上面的选项。看起来会好一点吗?您可以用其他运算符替换+,例如-、*,等等(使用SQL server 2005进行测试)

declare@x xml
设置@x='1020'
选择@x.query('
a/b中的$i
返回
数据($i/x[1])+数据($i/y[1])
')

如果路径太长,并且您希望为其使用“别名”,则可以选择上面的选项。看起来会好一点吗?您可以用其他运算符替换+,例如-、*,等等(使用SQL server 2005进行测试)

谢谢您的回答。遗憾的是,第一个解决方案给出了
Msg 9341,级别16,状态1,第3行XQuery[value()]:靠近“(”的语法错误,需要一个步骤表达式。
,第二个:
Msg 9335,级别16,状态1,第3行XQuery[value()]:XQuery语法“/function()'不受支持。
看起来它支持的XQuery子集实际上更接近XPath 1.0。感谢您的回答。遗憾的是,第一个解决方案给出了
Msg 9341,16级,状态1,第3行XQuery[value()]:靠近'('的语法错误,需要一个步骤表达式。
,第二个:
Msg 9335,16级,状态1,第3行XQuery[value()]:不支持XQuery语法“/function()”。
看起来它支持的XQuery子集实际上更接近XPath 1.0。