2011-10-04 15 views
15

Czy ktoś mógłby pokazać mi trochę TSQL, aby użyć do zapytania pliku xml tak, jakby był to stół?Wybierz dane z pliku XML jako tabelę w TSQL

Plik znajduje się na serwerze, "C: \ xmlfile.xml"

i zawiera

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

Przykâadowa jestem po

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

Odpowiedz

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) 

Produkuje:

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

Uwaga: Numer [1] jest potrzebny, aby wskazać, że chcesz wybrać pierwszą wartość sekwencji, ponieważ zapytanie może zwrócić więcej niż jedną dopasowaną wartość w wierszu (wyobrazić sobie plik XML zawierający kilka filtrów IDID na filtr SpangemansFilter).

Myślałem, że to warto wiedzieć, więc Googled i przeczytać wiele postów aż znalazłem this one.

UPDATE Aby załadować z pliku:

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

SELECT @xmlData

+0

To świetnie, ale nie określasz, jak to zrobić z pliku XML, a nie z zmiennej @xmlData. Plik znajduje się na serwerze, "C: \ xmlfile.xml" – Hoody

+1

@spangeman zobacz moją aktualizację – Icarus

+0

Działa doskonale dziękuję !!! – Hoody

0

W moim przypadku dane, którymi byłem zainteresowany, były zawarte w atrybutach węzła, a nie w wartościach. Poniżej znajduje się przykład tego, jak można uzyskać dostęp do atrybutów.

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) 
Powiązane problemy