2011-10-04 24 views
15

Qualcuno potrebbe mostrarmi alcuni TSQL da utilizzare per eseguire una query su un file xml come se fosse una tabella?Selezionare i dati dal file XML come tabella in TSQL

Il file si trova sul server, "C: \ Xmlfile.xml"

e contiene

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

uscita Esempio Sono dopo

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

risposta

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) 

produce:

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

Nota: lo [1] è necessario per indicare che si desidera selezionare il primo valore della sequenza poiché la query può restituire più di un valore corrispondente per riga (si immagini il proprio XML contenente diversi ID di filtro per SpangemansFilter).

Ho pensato che questo è stato utile per conoscere, così ho concentrandoci e letto molti messaggi fino a quando ho trovato this one.

AGGIORNAMENTO Per caricare un file:

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

SELEZIONA @xmlData

+0

È ottimo ma non si specifica come eseguire questa operazione da un file XML anziché da una variabile @xmlData. Il file si trova sul server "C: \ xmlfile.xml" – Hoody

+1

@spangeman vedi il mio aggiornamento – Icarus

+0

Funziona perfettamente grazie !!! – Hoody

0

Nel mio caso, i dati a cui ero interessato erano contenuti negli attributi del nodo piuttosto che nei valori. Di seguito è riportato un esempio di come è possibile accedere agli attributi.

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