2012-10-18 63 views
9

Tôi có một số XML mà tôi cần phân tích bằng cách sử dụng SQL Server 2008. Tôi nghĩ rằng tôi gần đạt được những gì tôi muốn, nhưng tôi không có cú pháp chính xác (tôi tin).Chọn phần tử XML trong SQL Server

tôi có như sau:

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) 

tôi nhận được kết quả như sau:

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

Tôi đang cố gắng để có được những điều sau đây:

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

Tôi đang làm gì sai ?

+1

1 để dễ dàng kiểm chứng/example tái sản xuất –

Trả lời

6

Cú pháp cho grabbing một yếu tố là:

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) 

này cũng xuất hiện để làm việc mà không có ngoặc rõ ràng:

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

Cú pháp @ là cho các thuộc tính, chứ không phải yếu tố trong XQuery . Nếu bạn có

<InvoiceDetail title="something"> 

Sau đó, bạn sẽ có thể truy vấn rằng việc sử dụng:

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

Đây là một bài viết tốt về việc sử dụng XQuery value

+0

Cảm ơn Adam cho sự hướng dẫn và liên kết bên ngoài. – jared

0

Các SQL sau đây cũng sẽ làm việc độc đáo với dữ liệu của bạn:

-- 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) 

Điều này cho chúng tôi những kết quả sau:

enter image description here

(Cú pháp là khó hiểu, mặc dù không phải là nó!)

Các vấn đề liên quan