Sql server 在SQL Server XPath表达式中组合变量

Sql server 在SQL Server XPath表达式中组合变量,sql-server,tsql,xpath,Sql Server,Tsql,Xpath,我在SQL Server上有一个表达式,它可以正常工作: xmlData.value('sum(//*[variable1="222"]/./variable3)', 'float') 我想重写它,使其包含以下三个变量: declare @var1 nvarchar(max) = 'variable1' declare @var2 int = 222 declare @var3 nvarchar(max) = 'variable3' 下面是一些与我的问题相关的xml: <main>

我在SQL Server上有一个表达式,它可以正常工作:

xmlData.value('sum(//*[variable1="222"]/./variable3)', 'float')
我想重写它,使其包含以下三个变量:

declare @var1 nvarchar(max) = 'variable1'
declare @var2 int = 222
declare @var3 nvarchar(max) = 'variable3'
下面是一些与我的问题相关的xml:

<main>
  <TAL>
    <variable1>222</variable1>
    <Name>someName1</Name>
    <a>2</a>
    <b>73</b>
    <variable3>1</variable3>
  </TAL>
  <TAL>
    <variable1>333</variable1>
    <Name>someName2</Name>
    <a>4</a>
    <b>56</b>
    <variable3>2</variable3>
  </TAL>
</main>

但是没有成功。使用变量编写XPath表达式的正确方法是什么?

因为我们要将路径移动到节点测试中,所以我们必须重新安排一些内容。不幸的是,这样的查询缺乏静态路径的便利性

select xmlData.value('
    sum(
        //*[local-name()=sql:variable("@var1") and data(.)=sql:variable("@var2")]
            /parent::*/*[local-name()=sql:variable("@var3")]
    )', 'float')

嗨,利文特,你能用语言解释一下你想要达到的目标吗?我真的不知道您在问题中的示例xpath查询想要实现什么。感谢TT,我正在搜索一个名为“variable1”的元素及其值。如果它是222,我将得到它的兄弟元素“variable3”的值。问题是我需要将变量作为参数传递给函数,所以表达式需要再次包含它们。通常对于这样的问题,可以方便地包含一些供人们玩弄的示例XML,以及用于验证的示例XPath查询的预期结果。让这里的人更容易从回答你的问题开始。使用问题下方的
edit
链接,“编辑你的问题”始终可以包含这样的示例。根据你的建议,该问题现在包含我的一些xml。谢谢Jeroen,它起作用了!这正是我需要的。非常感谢@livnt只是一个小小的提示:我会使用
(text()[1]cast as xs:int?
,而不是
数据(.)
,这将启用作为int值的比较,您可以使用
/../
而不是
/parent::*/
-但这更多是一个品味问题。。。
select xmlData.value('
    sum(
        //*[local-name()=sql:variable("@var1") and data(.)=sql:variable("@var2")]
            /parent::*/*[local-name()=sql:variable("@var3")]
    )', 'float')