[英]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.