2013-06-29 4 views
2

다음 xml 있습니다. 실행하면 그리드 결과가 3 개가됩니다. 나는 그리드 결과에 관련 협회가 필요하기 때문에 마지막 그리드 결과에 어려움을 겪고있다. 즉, 그리드 결과 # 3에서 그리드 결과 # 2에서 관련 RowID를 갖고 싶습니다. 어떻게해야합니까? 결국 그리드 결과 # 2는 SalesOrderID라는 기본 키가있는 영구 테이블에 삽입됩니다. 모눈 결과 # 3은 SalesOrderID가 외래 키인 다른 테이블로 이동합니다.xml을 파쇄하고 연결을 유지하려면 어떻게해야합니까?

대단히 감사합니다!

DECLARE @string VARCHAR(max); 
DECLARE @xml XML; 
SET @string ='<ShipmentConfirmationMessage> 
    <ExternalCorrelationId>249801</ExternalCorrelationId> 
    <ShippedItems> 
    <ShipmentConfirmationLine> 
     <SalesOrderNumber>SalesOrder1</SalesOrderNumber> 
     <ItemId>10982</ItemId> 
     <IsBackOrdered>false</IsBackOrdered> 
     <TrackingNumber>Track1234</TrackingNumber> 
     <Lots> 
     <Lot> 
      <LotNumber>789</LotNumber> 
      <ExpiryDate>2013-12-20T00:00:00</ExpiryDate> 
      <Quantity>1.55</Quantity> 
     </Lot> 

     </Lots> 
    </ShipmentConfirmationLine> 
    <ShipmentConfirmationLine> 
     <SalesOrderNumber>SalesOrder2</SalesOrderNumber> 
     <ItemId>10983</ItemId> 
     <IsBackOrdered>true</IsBackOrdered> 
     <TrackingNumber>Track123456789</TrackingNumber> 
     <Lots> 
     <Lot> 
      <LotNumber>1</LotNumber> 
      <ExpiryDate>2013-12-20T00:00:00</ExpiryDate> 
      <Quantity>3.30</Quantity> 
     </Lot> 
     <Lot> 
      <LotNumber>21</LotNumber> 
      <ExpiryDate>2016-12-20T00:00:00</ExpiryDate> 
      <Quantity>34.30</Quantity> 
     </Lot> 
     </Lots> 
    </ShipmentConfirmationLine> 
     </ShippedItems> 
</ShipmentConfirmationMessage> 
'; 
SET @xml = CONVERT(XML, @string, 1); 
-- header 
SELECT 
@xml.value('/ShipmentConfirmationMessage[1]/ExternalCorrelationId[1]', 'varchar(50)') PurchaseOrderID 
-- detail lines 
SELECT IDENTITY(int, 1,1) AS RowID 
,doc.col.value('SalesOrderNumber[1]', 'varchar(50)') SalesOrderNumber 
,doc.col.value('ItemId[1]', 'varchar(50)') ItemId 
,doc.col.value('IsBackOrdered[1]', 'varchar(50)') IsBackOrdered 
,doc.col.value('TrackingNumber[1]', 'varchar(50)') TrackingNumber 
INTO #tmpDetails 
FROM @xml.nodes('/ShipmentConfirmationMessage/ShippedItems/ShipmentConfirmationLine') doc(col) 
select * from #tmpDetails 

-- lots associated with detail lines 
SELECT 
'Relevant RowID goes here', 
doc.col.value('LotNumber[1]', 'varchar(50)') LotNumber 
,doc.col.value('ExpiryDate[1]', 'datetime') ExpiryDate 
,doc.col.value('Quantity[1]', 'decimal(13,5)') Quantity 
FROM @xml.nodes('/ShipmentConfirmationMessage/ShippedItems/ShipmentConfirmationLine/Lots/Lot') doc(col) 

drop table #tmpDetails 

답변

0

스토어 Lots에서 XML을 파쇄하는 CROSS APPLY와 세 번째 쿼리에 #tmpDetails.Lots

SELECT IDENTITY(int, 1,1) AS RowID 
,doc.col.value('SalesOrderNumber[1]', 'varchar(50)') SalesOrderNumber 
,doc.col.value('ItemId[1]', 'varchar(50)') ItemId 
,doc.col.value('IsBackOrdered[1]', 'varchar(50)') IsBackOrdered 
,doc.col.value('TrackingNumber[1]', 'varchar(50)') TrackingNumber 
,doc.col.query('Lots') Lots 
INTO #tmpDetails 
FROM @xml.nodes('/ShipmentConfirmationMessage/ShippedItems/ShipmentConfirmationLine') doc(col) 

에서 Lots에 대한 XML을 사용 #tmpDetails.

SELECT 
    D.RowID 
,doc.col.value('LotNumber[1]', 'varchar(50)') LotNumber 
,doc.col.value('ExpiryDate[1]', 'datetime') ExpiryDate 
,doc.col.value('Quantity[1]', 'decimal(13,5)') Quantity 
FROM #tmpDetails D 
    CROSS APPLY D.Lots.nodes('Lots/Lot') doc(col) 
+0

감사합니다. Mikael. – Daisy

관련 문제