簡體   English   中英

使用XML從SQL查詢值

[英]SQL Query values out of XML using

我不知道我在做什么錯。 我將XML作為文本存儲在表列中。 我正在獲取ID和XML文本,並將其查詢到將XML作為XML類型存儲的臨時表中。

XML中的每個Order都具有多個許可證,我需要提取並使用OrderID和License 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?

非常感謝您的幫助。 我一直在努力使這項工作幾天

您缺少名稱空間,因此查詢與xml不匹配,因此找不到您要查詢的元素。

;具有XMLNAMESPACES

https://docs.microsoft.com/zh-cn/sql/t-sql/xml/with-xmlnamespaces

假設您的表中有一個完整的有效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()指令WITH XMLNAMESPACES()

接下來,您需要使用.nodes()來獲取每個<OrderInfo>節點的XML片段列表,該節點位於根節點( <OrderFromCRM><OrderFromCRM> 這是第一個CROSS APPLY 這將返回XML片段列表,每個<OrderInfo>節點一個。

然后,您需要深入研究這些XML片段,並再次將CROSS APPLY.nodes()函數一起使用,以獲取<Foundation>元素的列表(包含在<Licensing>/<Foundations>子樹中,以從中獲取許可證ID。此外,您需要第二個CROSS APPLY來獲取<Licensing>/<Licenses>下的所有<License>子節點,以獲取那些LicenseId屬性。

那應該返回類似以下的輸出:

在此處輸入圖片說明

希望這對您有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM