2016-09-02 1 views
0

У меня есть этот скрипт, который выбирает значение из отчета xml. Отчет содержит многие из этих значений с тем же именем, и я хотел бы выбрать все значения в списке.Итерация через список XML при разборе SQL-сервера

Я знаю, что число элементов Мне нужно перебирать

;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

, очень новым для этой уценки, поэтому я скрепил xml http://pastebin.com/knT8Lxbi – mcorkers

+0

@mcorkers см. Мое обновление – Shnugo

+0

Эй, это работает благодаря ! Еще один запрос, что, если я хочу принести нули, если paymentdate не находится в одной из записей? – mcorkers