2012-10-18 12 views
9

में XML तत्व का चयन करें मेरे पास कुछ XML है जो मुझे SQL Server 2008 का उपयोग करके पार्स करने की आवश्यकता है। मुझे लगता है कि मैं जो चाहता हूं उसे पाने के करीब हूं, लेकिन मेरे पास सही वाक्यविन्यास नहीं है (मुझे विश्वास है)।SQL सर्वर

DECLARE @doc XML 
SET @doc = '<ROOT>   
    <InvoiceDetail> 
     <OrderId>1000000</OrderId> 
     <OrderTypeId>2</OrderTypeId> 
     <Id>2000</Id> 
     <InvoiceItems> 
      <InvoiceItem> 
       <LineId>1</LineId> 
       <Cd>123456</Cd> 
       <Description>Item 1</Description> 
       <Quantity>1</Quantity> 
       <UnitPrice>99.990000</UnitPrice> 
      </InvoiceItem> 
      <InvoiceItem> 
       <LineId>2</LineId> 
       <Cd>234567</Cd> 
       <Description>Item 2</Description> 
       <Quantity>1</Quantity> 
       <UnitPrice>89.990000</UnitPrice> 
      </InvoiceItem> 
     </InvoiceItems> 
    </InvoiceDetail> 
    <InvoiceDetail> 
     <OrderId>1200000</OrderId> 
     <OrderTypeId>1</OrderTypeId> 
     <Id>3000</Id> 
     <InvoiceItems> 
      <InvoiceItem> 
       <LineId>1</LineId> 
       <Cd>234567</Cd> 
       <Description>Item 2</Description> 
       <Quantity>1</Quantity> 
       <UnitPrice>89.990000</UnitPrice> 
      </InvoiceItem> 
      <InvoiceItem> 
       <LineId>2</LineId> 
       <Cd>345678</Cd> 
       <Description>Item 3</Description> 
       <Quantity>1</Quantity> 
       <UnitPrice>79.990000</UnitPrice> 
      </InvoiceItem> 
     </InvoiceItems> 
    </InvoiceDetail> 
</ROOT>' 

SELECT 
     Invoices.Node.value('@OrderId', 'VARCHAR(10)') 'OrderID' 
    , Invoices.Node.value('@Id', 'INT') 'InvoiceId' 
    , Items.Cd.value('.', 'VARCHAR(14)') 'ItemId' 
FROM 
    @doc.nodes('//InvoiceDetail') Invoices(Node) 
    CROSS APPLY Invoices.Node.nodes('./InvoiceItems/InvoiceItem/Cd') Items(Cd) 

मैं निम्नलिखित परिणाम प्राप्त:

1000000 2000 123456 
1000000 2000 234567 
1200000 3000 234567 
1200000 3000 345678 

मैं गलत क्या कर रहा हूँ:

NULL NULL 123456 
NULL NULL 234567 
NULL NULL 234567 
NULL NULL 345678 

मैं निम्नलिखित प्राप्त करने के लिए कोशिश कर रहा हूँ

मैं निम्नलिखित है ?

+1

आसानी से परीक्षण योग्य/प्रतिलिपि प्रस्तुत करने योग्य उदाहरण मार्गदर्शन और बाहरी लिंक के लिए –

उत्तर

6

सिंटेक्स एक तत्व हथियाने के लिए है:

SELECT Invoices.Node.value('(OrderId)[1]', 'VARCHAR(10)') 'OrderID' 
    , Invoices.Node.value('(Id)[1]', 'INT') 'InvoiceId' 
    , Items.Cd.value('.', 'VARCHAR(14)') 'ItemId' 
FROM 
    @doc.nodes('//InvoiceDetail') Invoices(Node) 
    CROSS APPLY Invoices.Node.nodes('./InvoiceItems/InvoiceItem/Cd') Items(Cd) 

यह भी स्पष्ट कोष्टक के बिना काम करने के लिए प्रकट होता है:

Invoices.Node.value('OrderId[1]', 'VARCHAR(10)') 

@ वाक्य रचना विशेषताओं के लिए, XQuery में नहीं तत्वों है ।

SELECT Invoices.Node.value('@title', 'VARCHAR(MAX)') AS Title 
FROM @doc.nodes('//InvoiceDetail') Invoices(Node) 

यहाँ XQuery value

+0

धन्यवाद एडम के लिए +1। – jared

0

का उपयोग कर निम्नलिखित एसक्यूएल भी अपने डेटा के साथ अच्छी तरह से काम करेगा के बारे में एक अच्छा लेख है: यदि आप

<InvoiceDetail title="something"> 

था तो फिर तुम क्वेरी करने के लिए है कि का उपयोग कर में सक्षम हो जाएगा:

-- Iterate through each of the "ROOT\InvoiceDetail" records in our XML 
SELECT 
    x.Rec.query('./OrderId').value('.', 'nvarchar(2000)') AS 'OrderID', 
    x.Rec.query('./Id').value('.', 'nvarchar(2000)') AS 'ID', 
    items.cd.query('./Cd').value('.', 'nvarchar(2000)') AS 'ItemID' 
FROM @doc.nodes('/ROOT/InvoiceDetail') as x(Rec) 
CROSS APPLY x.Rec.nodes('./InvoiceItems/InvoiceItem') Items(Cd) 

यह हमें ये परिणाम देता है:

enter image description here

(वाक्य रचना हालांकि चौंकाने है, यह नहीं है!)