【问题标题】:Using relative paths within SQL XQuery arithmetic在 SQL XQuery 算法中使用相对路径
【发布时间】:2016-09-19 15:15:53
【问题描述】:

有没有一种简单的方法可以在 SQL Server 的 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');即类似于如何将过滤器应用于当前路径上下文中的多个元素;但还没有找到如何写(假设这是可能的)。

【问题讨论】:

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


    【解决方案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 2005 测试)

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      可能会成功。

      【讨论】:

      • 感谢您的回答。可悲的是,第一个解决方案给出了Msg 9341, Level 16, State 1, Line 3 XQuery [value()]: Syntax error near '(', expected a step expression. ,第二个:Msg 9335, Level 16, State 1, Line 3 XQuery [value()]: The XQuery syntax '/function()' is not supported.
      • 看起来它支持一个实际上更接近 XPath 1.0 的 XQuery 子集。
      猜你喜欢
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 2016-11-09
      • 1970-01-01
      • 2014-02-20
      相关资源
      最近更新 更多