【问题标题】:SQL Query values out of XML usingSQL使用XML查询值
【发布时间】:2018-01-21 01:38:34
【问题描述】:

我不知道我做错了什么。我将 XML 作为文本存储在表格列中。我正在获取 ID 和 XML 文本并将其查询到将 XML 存储为 XML 类型的临时表中。

XML 中的每个订单都有多个许可证,我需要提取这些许可证并使用 OrderID 和许可证 ID 创建一个新表。但我不能说我做错了什么。

所以,我正在尝试开始基本操作,但我什至无法从第一个节点获取帐户信息。

XML 如下所示:

 <ns1:OrderFromCRM xmlns:ns1="http://company.com/licensing/neworder/v2">
      <ns1:AccountInfo Name="Company Name" AccountId="A012345" />
      <ns1:OrderInfo CRMOrderId="S147360" Date="2/23/2017 12:00:00 AM" ffEmail="emailaddress.@gmail.com" >
        <ns1:Licensing>
          <ns1:Foundations>
            <ns1:Foundation LicenseId="L012345678" Action="Create" Environment="Production" Type="Enterprise">
              <Metadata>
                <AllowedInstances>999</AllowedInstances>
              </Metadata>
            </ns1:Foundation>
            <ns1:Foundation LicenseId="L012345698" Action="Create" Environment="Production" Type="Enterprise">
              <Metadata>
                <AllowedInstances>999</AllowedInstances>
              </Metadata>
            </ns1:Foundation>
          </ns1:Foundations>
          <ns1:Licenses Type="Create">
            <ns1:License LicenseId="L0123451234" ProductFamily="Fam1" Product="EStudio" LicenseType="Perpetual" StartDate="2017-02-23" ExpiryDate="2017-12-18" MaintenanceExpiryDate="2017-12-18">
              <ns1:Capabilities>
                <ns1:Capability Name="T1" />
                <ns1:Capability Name="Q1" />
                <ns1:Capability Name="B1" />
              </ns1:Capabilities>
            </ns1:License>
            <ns1:License LicenseId="L333356675"  ProductFamily="Fam1" Product="EStudio" LicenseType="Perpetual" StartDate="2017-02-23" ExpiryDate="2017-12-18" MaintenanceExpiryDate="2017-12-18">
              <ns1:Capabilities>
                <ns1:Capability Name="T1" />
                <ns1:Capability Name="Q1" />
                <ns1:Capability Name="B1" />
              </ns1:Capabilities>
            </ns1:License>

我写的SQL是:

CREATE TABLE #demoData
 (
    ActivationCode NVARCHAR(100) NOT NULL,
    OrderXMLText XML
 )

SELECT OrderId, OrderXMLText.value('(/OrderFromCRM/AccountInfo)[1]', 'varchar(30)') 
FROM #DEMODATA

我提到我需要 OrderID 和 LicenseId,但即便如此,我什么也得不到。我在正确的轨道上吗?首先,我错过了什么?其次,一旦格式正确,如何在 XML 中获取嵌套的 LicenseId?

非常感谢您的帮助。几天来我一直在努力完成这项工作

【问题讨论】:

标签: sql-server xml namespaces


【解决方案1】:

您缺少命名空间,因此查询与 xml 不匹配,因此它找不到您正在查询的元素。

添加

;使用 XML 命名空间

https://docs.microsoft.com/en-us/sql/t-sql/xml/with-xmlnamespaces

【讨论】:

    【解决方案2】:

    假设您的表中有一个完整、有效的 XML 文档(您显示的文档缺少几个结束标签),那么您可以尝试以下操作:

    ;WITH XMLNAMESPACES('http://company.com/licensing/neworder/v2' AS ns1)
    SELECT
        ActivationCode, 
        CRMOrderId = XC.value('@CRMOrderId', 'varchar(100)'),
        FoundationsLicenseId = xcf.value('@LicenseId', 'varchar(50)'),
        LicensesLicenseId = xcl.value('@LicenseId', 'varchar(50)')
    FROM
        #demoData
    CROSS APPLY
        OrderXMLText.nodes('/ns1:OrderFromCRM/ns1:OrderInfo') AS XT(XC)
    CROSS APPLY
        XC.nodes('ns1:Licensing/ns1:Foundations/ns1:Foundation') AS XTF(XCF)
    CROSS APPLY
        XC.nodes('ns1:Licensing/ns1:Licenses/ns1:License') AS XTL(XCL)
    

    首先,您需要在 XQuery 中包含并尊重 XML 命名空间 - 这就是我使用 WITH XMLNAMESPACES() 指令所做的事情。

    接下来,您需要使用.nodes() 来获取位于根节点(&lt;OrderFromCRM&gt;)下方的每个&lt;OrderInfo&gt; 节点的XML 片段列表。这是第一个CROSS APPLY。这将返回一个 XML 片段列表,每个 &lt;OrderInfo&gt; 节点一个。

    然后您需要进入这些 XML 片段,并再次使用 CROSS APPLY.nodes() 函数来获取 &lt;Foundation&gt; 元素的列表(包含在 &lt;Licensing&gt;/&lt;Foundations&gt; 子树中以从那些节点。此外,您需要第二个CROSS APPLY 来获取&lt;Licensing&gt;/&lt;Licenses&gt; 下的所有&lt;License&gt; 子节点以获取那些LicenseId 属性。

    这应该会返回如下输出:

    希望对你有所帮助!

    【讨论】:

      猜你喜欢
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      相关资源
      最近更新 更多