2011-10-04 25 views
15

Ai đó có thể chỉ cho tôi một số TSQL để sử dụng truy vấn tệp xml như thể nó là một bảng không?Chọn dữ liệu từ tệp XML dưới dạng bảng trong TSQL

Các tập tin trên máy chủ, "C: \ xmlfile.xml"

Và chứa

<ArrayOfSpangemansFilter xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <SpangemansFilter> 
     <FilterID>1219</FilterID> 
     <Name>Fred</Name> 
     <Code>510</Code> 
     <Department>N</Department> 
     <Number>305327</Number> 
    </SpangemansFilter> 
    <SpangemansFilter> 
     <FilterID>3578</FilterID> 
     <Name>Gary</Name> 
     <Code>001</Code> 
     <Department>B</Department> 
     <Number>0692690</Number> 
    </SpangemansFilter> 
    <SpangemansFilter> 
     <FilterID>3579</FilterID> 
     <Name>George</Name> 
     <Code>001</Code> 
     <Department>X</Department> 
     <Number>35933</Number> 
    </SpangemansFilter> 
</ArrayOfSpangemansFilter> 

Ví dụ đầu ra tôi sau khi

FilterID |Name  |Code  |Department    |Number 
------------------------------------------------------------------- 
1219  |Fred  |510  |N      |305327 
3578  |Gary  |001  |B      |0692690 
3579  |George  |001  |X      |35933 

Trả lời

25
set @xmlData='<?xml version="1.0"?> 
<ArrayOfSpangemansFilter xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<SpangemansFilter> 
<FilterID>1219</FilterID> 
<Name>Fred</Name> 
<Code>510</Code> 
<Department>N</Department> 
<Number>305327</Number> 
</SpangemansFilter> 
<SpangemansFilter> 
<FilterID>3578</FilterID> 
<Name>Gary</Name> 
<Code>001</Code> 
<Department>B</Department> 
<Number>0692690</Number> 
</SpangemansFilter> 
<SpangemansFilter> 
<FilterID>3579</FilterID> 
<Name>George</Name> 
<Code>001</Code> 
<Department>X</Department> 
<Number>35933</Number> 
</SpangemansFilter> 
</ArrayOfSpangemansFilter>' 


SELECT 
    ref.value('FilterID[1]', 'int') AS FilterID , 
    ref.value('Name[1]', 'NVARCHAR (10)') AS Name , 
    ref.value('Code[1]', 'NVARCHAR (10)') AS Code , 
    ref.value('Department[1]', 'NVARCHAR (3)') AS Department, 
    ref.value('Number[1]', 'int') AS Number  
FROM @xmlData.nodes('/ArrayOfSpangemansFilter/SpangemansFilter') 
xmlData(ref) 

Tạo:

FilterID Name  Code  Department Number 
----------- ---------- ---------- ---------- ----------- 
1219  Fred  510  N   305327 
3578  Gary  001  B   692690 
3579  George  001  X   35933 

Lưu ý: Cần có [1] để chỉ ra rằng bạn muốn chọn giá trị đầu tiên của chuỗi vì truy vấn có thể trả về nhiều giá trị phù hợp cho mỗi hàng (hãy tưởng tượng XML của bạn có chứa một số FilterID trên mỗi SpangemansFilter).

Tôi nghĩ đây là hữu ích để biết, vì vậy tôi đã google và đọc nhiều bài viết cho đến khi tôi tìm thấy this one.

CẬP NHẬT Để tải từ file:

DECLARE @xmlData XML 
SET @xmlData = (
    SELECT * FROM OPENROWSET (
    BULK 'C:\yourfile.xml', SINGLE_CLOB 
) AS xmlData 
) 

CHỌN @xmlData

+0

Thật tuyệt vời nhưng bạn không chỉ định cách thực hiện việc này từ tệp XML thay vì biến @xmlData. Tệp nằm trên máy chủ, "C: \ xmlfile.xml" – Hoody

+1

@spangeman xem cập nhật của tôi – Icarus

+0

Hoạt động hoàn toàn cảm ơn bạn !!! – Hoody

0

Trong trường hợp của tôi - dữ liệu tôi quan tâm được chứa trong các thuộc tính nút chứ không phải là các giá trị. Dưới đây bao gồm một ví dụ về cách các thuộc tính có thể được truy cập.

DECLARE @xmlData XML 
set @xmlData='<?xml version="1.0"?> 
<ArrayOfSpangemansFilter xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<SpangemansFilter FilterID="1219" Name="Fred" Code="510" Department="N" Number="305327"> 
</SpangemansFilter> 
<SpangemansFilter FilterID="3578" Name="Gary" Code="001" Department="B" Number="0692690"> 
</SpangemansFilter> 
<SpangemansFilter FilterID="3579" Name="George" Code="001" Department="X" Number="35933"> 
</SpangemansFilter> 
</ArrayOfSpangemansFilter>' 


SELECT 
    ref.value('@FilterID', 'int') AS FilterID , 
    ref.value('@Name', 'NVARCHAR (10)') AS Name , 
    ref.value('@Code', 'NVARCHAR (10)') AS Code , 
    ref.value('@Department', 'NVARCHAR (3)') AS Department, 
    ref.value('@Number', 'int') AS Number  
FROM @xmlData.nodes('/ArrayOfSpangemansFilter/SpangemansFilter') 
xmlData(ref) 
Các vấn đề liên quan