2011-10-04 18 views
15

¿Podría alguien mostrarme algún TSQL para consultar un archivo xml como si fuera una tabla?Seleccionar datos del archivo XML como tabla en TSQL

El archivo está en el servidor, "C: \ xmlfile.xml"

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

Ejemplo de salida yo después

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

Respuesta

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: El [1] es necesario para indicar que desea seleccionar el primer valor de la secuencia, ya que la consulta puede devolver más de un valor coincidente por fila (imagine que su XML contiene varios FilterID por SpangemansFilter).

pensé que esto era útil saber, por lo que busqué en Google y leer muchos mensajes hasta que encontré this one.

ACTUALIZACIÓN Para cargar un archivo:

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

SELECT @xmlData

+0

Eso es genial, pero no especifica cómo hacerlo desde un archivo XML en lugar de una variable @xmlData. El archivo está en el servidor, "C: \ xmlfile.xml" – Hoody

+1

@spangeman ver mi actualización – Icarus

+0

¡¡Funciona perfectamente gracias !!! – Hoody

0

En mi caso, los datos que me interesaron estaban contenidos en los atributos del nodo en lugar de los valores. A continuación se incluye un ejemplo de cómo se puede acceder a los atributos.

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