【问题标题】:XPath to fetch SQL XML valueXPath 获取 SQL XML 值
【发布时间】:2018-08-28 20:12:41
【问题描述】:

这是我的问题:从列中的以下 XML 中,我想知道在给定步骤 ID 和组件 ID 的情况下,名为“已启用”的变量的值是否等于“是”。

'<xml>
  <box stepId="1">
    <components>
      <component id="2">
        <variables>
          <variable id="3" nom="Server" valeur="DEV1" />
          <variable id="4" nom="Enabled" valeur="Yes" />
        </variables>
      </component>
      <component id="3">
        <variables>
          <variable id="3" nom="Server" valeur="DEV1" />
          <variable id="4" nom="Enabled" valeur="No" />
        </variables>
      </component>
    </components>
  </box>
  <box stepId="2">
    <components>
      <component id="2">
        <variables>
          <variable id="3" nom="Server" valeur="DEV2" />
          <variable id="4" nom="Enabled" valeur="Yes" />
        </variables>
      </component>
      <component id="3">
        <variables>
          <variable id="3" nom="Server" valeur="DEV2" />
          <variable id="4" nom="Enabled" valeur="No" />
        </variables>
      </component>
    </components>
  </box>
</xml>'

【问题讨论】:

    标签: sql-server tsql xpath


    【解决方案1】:

    更新

    我的建议是将 XML 分解为关系,并以面向集合的方式而不是在 XML 中搜索特定节点的过程方式,对结果关系进行搜索和连接。这是一个简单的 XML 查询,它分解了感兴趣的节点和属性:

    select x.value(N'../../../../@stepId', N'int') as StepID
      , x.value(N'../../@id', N'int') as ComponentID
      , x.value(N'@nom',N'nvarchar(100)') as Nom
      , x.value(N'@valeur', N'nvarchar(100)') as Valeur
    from @x.nodes(N'/xml/box/components/component/variables/variable') t(x)
    

    但是,如果您必须使用能够准确检索感兴趣值的 XPath:

    select x.value(N'@valeur', N'nvarchar(100)') as Valeur
    from @x.nodes(N'/xml/box[@stepId=sql:variable("@stepID")]/
        components/component[@id = sql:variable("@componentID")]/
           variables/variable[@nom="Enabled"]') t(x)
    

    如果 stepID 和组件 ID 是列而不是变量,您应该在 XPath 过滤器中使用 sql:column() 而不是 sql:variable。见Binding Relational Data Inside XML Data

    最后,如果您只需要检查是否存在,您可以使用exist() XML 方法:

    select @x.exist(
      N'/xml/box[@stepId=sql:variable("@stepID")]/
        components/component[@id = sql:variable("@componentID")]/
          variables/variable[@nom="Enabled" and @valeur="Yes"]') 
    

    【讨论】:

    • 什么是@x(将注释填充到 15 个字符)
    • 我怀疑他在 SQL Server 查询窗口中的语句上方有DECLARE @x XML = (xml from question);,以便使用该 XML 进行测试,但将其从他的答案中删除,因为这将是多余的。说了这么多,我怀疑它是一个包含问题中 XML 的变量。
    【解决方案2】:

    我总是回到这篇文章SQL Server 2005 XQuery and XML-DML - Part 1 了解如何使用 SQL Server 2005 中的 XML 功能。

    对于基本的 XPath 知识,我推荐W3Schools tutorial

    【讨论】:

    • 这两个链接都失效了。我建议查看语言参考:docs.microsoft.com/en-us/sql/xquery/…
    • 链接已失效。
    • @user482745:第一个链接工作正常 - 更新了第二个链接,再次工作,也是
    【解决方案3】:

    我认为你想要的 xpath 查询是这样的:

    /xml/box[@stepId="$stepId"]/components/component[@id="$componentId"]/variables/variable[@nom="Enabled" and @valeur="Yes"]
    

    这应该会为您提供名为“已启用”的变量,指定的 $stepId 和 $componentId 的值为“Yes”。这是假设您的 xml 以您显示的标签开头,而不是

    如果 SQL Server 2005 XPath 的内容非常简单(我从未使用过),那么上面的查询应该可以工作。否则,其他人可能需要帮助您。

    【讨论】:

    • 谢谢,有帮助。如果找到匹配项,我如何返回真或假?或者返回 0 或 1。
    • 我不确定。你可以尝试这样的事情: IF count() >= 1 SELECT 1 ELSE SELECT 0
    • 您可以使用 EXIST 方法。 Field.EXIST('xpath')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多