2014-10-27 70 views
1

我需要將以下XML解析爲每天的客戶事務處理表。 XML文件來自不受我控制的外部服務。在SQL Server 2012中使用不存在的元素解析XML內容

問題是,當客戶當天沒有交易,我無法在我的表格中查看它。我如何才能看到客戶零交易?

declare @xml xml = 
'<root> 
    <customers> 
     <customer id="777"> 
      <orders> 
      <order currency="USD" id="888" date="2014-06-18"> 
       <transactions> 
       <transaction id="998"> 
        <date>2014-08-01</date> 
        <itemid>10001</itemid> 
        <amount>745.96</amount> 
       </transaction> 
       </transactions> 
      </order> 
      </orders> 
    </customer> 
    <customer id="778"> 
     <orders> 
     <order id="999" /> 
     </orders> 
    </customer> 
    </customers> 
</root>' 

我改造的查詢是這樣的:

select 
newid()             ID, 
    ltrim(rtrim(B.C.value('@id', 'nvarchar(50)')))   CUSTOMER_ID, 
    ltrim(rtrim(K.C.value('@id', 'nvarchar(450)')))   ACCOUNT_ID, 
    ltrim(rtrim(K.C.value('@date', 'datetime')))   DATE_PLACED, 
    ltrim(rtrim(K.C.value('@currency', 'nvarchar(50)'))) CURRENCY, 
    ltrim(rtrim(T.C.value('@id', 'nvarchar(50)')))   TRANSACTION_ID, 
    ltrim(rtrim(T.C.value('date[1]', 'datetime')))   TRANSACTION_DATE, 
    ltrim(rtrim(T.C.value('itemid[1]', 'nvarchar(50)'))) TRANSACTION_ITEMID, 
    ltrim(rtrim(T.C.value('amount[1]', 'money'))) TRANSACTION_BANK_CODE 
from 
@xml.nodes('/root/customers/customer') as B(C) 
outer apply B.C.nodes('/root/customers/customer/orders/order') as K(C) 
outer apply K.C.nodes('/root/customers/customer/orders/order/transactions/transaction') as T(C) 

where 
    ltrim(rtrim(b.c.value('@id', 'nvarchar(50)'))) = ltrim(rtrim(k.c.value('../../@id', 'nvarchar(50)'))) 
and 
(
    (
     t.c.value('../../@id','nvarchar(50)') is not null 
     and 
     ltrim(rtrim(k.c.value('@id','nvarchar(50)'))) = ltrim(rtrim(t.c.value('../../@id','nvarchar(50)'))) 
    ) 
    or (ltrim(rtrim(t.c.value('../../@id','nvarchar(50)'))) is null) 
) 

預先感謝您!

回答

2

您不應該對來自根目錄的完整xpath進行交叉應用。從你的位置開始,並刪除where子句。

select newid() as ID, 
     B.C.value('@id', 'nvarchar(50)') as CUSTOMER_ID, 
     K.C.value('@id', 'varchar(50)') as ACCOUNT_ID, 
     T.C.value('@id', 'nvarchar(50)') as TRANSACTION_ID 
from @xml.nodes('/root/customers/customer') as B(C) 
    outer apply B.C.nodes('orders/order') as K(C) 
    outer apply K.C.nodes('transactions/transaction') as T(C) 

結果

ID         CUSTOMER_ID ACCOUNT_ID TRANSACTION_ID 
------------------------------------ ----------- ---------- -------------- 
767FCA17-578A-495E-9EFA-75E3509B2BD2 777   888  998 
59965290-EB7C-429B-AA5F-97EED0EB35BD 778   999  NULL 
+0

的幫助下,我與「/命令/命令」,由於它沒有工作,嘗試了「與你在哪裏開始」,已經放棄了這一想法。現在刪除第一個反斜線,它的工作!謝謝! – 2014-10-27 12:58:02