2016-09-02 49 views
0

我有這個腳本從xml報表中選擇一個值。該報告包含許多相同名稱的這些值,我想選擇列表中的所有值。解析SQL服務器時迭代XML列表

我知道我需要通過

;WITH XMLNAMESPACES (DEFAULT 'uri:website.co.uk/soap:examplenamespace') 
select top 100 report.value('(//report/paymentinfo/paymentdate)[1]', 'nvarchar(200)'), report 
from  
[dbo].[reports] 

迭代的項目數量有50個值,我需要遍歷,而不只是第1所以像

;WITH XMLNAMESPACES (DEFAULT 'uri:website.co.uk/soap:examplenamespace') 
select top 100 report.value('(//report/paymentinfo/paymentdate)[1-50]', 'nvarchar(200)'), report 
from  
[dbo].[reports] 
+0

請張貼您的(縮小的)XML。該解決方案將''CROSS APPLY'與'.nodes()' – Shnugo

回答

0

THX提供在XML,現在的答案是簡單的:

CREATE TABLE #YourReportTable(report XML); 
INSERT INTO #YourReportTable VALUES 
('<report> 
    <accs> 
     <acc> 
      <paymentinfo> 
      <paymentdate>2001-03-05</paymentdate> 
      <amount>1200.00</amount> 
      </paymentinfo> 
     </acc> 
     <acc> 
      <paymentinfo> 
      <paymentdate>2001-04-05</paymentdate> 
      <amount>1200.00</amount> 
      </paymentinfo> 
     </acc> 
     <acc> 
      <paymentinfo> 
      <paymentdate>2001-05-05</paymentdate> 
      <amount>1200.00</amount> 
      </paymentinfo> 
     </acc> 
    </accs> 
    </report>'); 

SELECT TOP 100 rep.value('(paymentdate)[1]', 'date') AS PaymentDate 
       ,rep.value('(amount)[1]', 'decimal(10,4)') AS Amount 
FROM #YourReportTable AS repTbl 
CROSS APPLY repTbl.report.nodes('/report/accs/acc//paymentinfo') AS A(rep); 
GO 

DROP TABLE #YourReportTable; 

結果

PaymentDate Amount 
2001-03-05 1200.0000 
2001-04-05 1200.0000 
2001-05-05 1200.0000 
+0

非常新的這種降價相關,所以我pasteinned的XML http://pastebin.com/knT8Lxbi – mcorkers

+0

@mcorkers看到我的更新 – Shnugo

+0

嘿,這工作謝謝!還有一個請求,如果我想如果paymentdate不在其中一個記錄中時帶來空值,該怎麼辦? – mcorkers