2012-06-28 24 views
7

Actualmente tengo este código que almacena XML en una columna de tipo XML llamada datos, en una tabla llamada Almacenamiento.Trituración XML de la columna de la tabla en una vista en SQL Server

CREATE TABLE Storage 
(
    ID INT IDENTITY(1,1) PRIMARY KEY, 
    data XML NOT NULL 
) 

GO 

INSERT INTO Storage(data) 
VALUES('<footballteams> 
    <team manager="Benitez">  
     <name>Liverpool</name>  
     <ground>Anfield</ground> 
    </team> 
    <team manager="Mourinho">  
     <name>Chelsea</name>  
     <ground>Stamford Bridge</ground> 
    </team> 
    <team manager="Wenger">  
     <name>Arsenal</name>  
     <ground>Highbury</ground> 
    </team> 
</footballteams>'); 

Me gustaría crear una vista llamada de fútbol Ver la que tritura los datos y lo muestra en la forma: FootballView (teamname, Gerente de Planta).

He triturado documentos completos utilizando el método .nodes() en columnas de tabla antes, pero parece ser más difícil al crear una vista (tengo mis razones para usar vistas). El problema es que anteriormente simplemente llamaba a .nodes en una variable @input que se DECLARA como xml = 'xmlcontent', pero con vistas esto no se puede hacer, y quiero analizar el XML contenido en la columna de la tabla de almacenamiento.

¿Alguna idea? Gracias por adelantado.

EDIT:

Anteriormente, si hubiera destrozado en las tablas de esto sería el código que utilizo:

SELECT  
     TeamName = Foot.value('(name)[1]', 'varchar(100)'),  
     Manager = Foot.value('(@manager)', 'varchar(100)'),  
     Ground = Foot.value('(ground)[1]', 'varchar(100)') 
FROM  
     @input.nodes('/footballteams/team') AS Tbl(Foot) 

Edit2: Esta es la salida que espero.

Expected Output

+0

Puede publicar el código que utilizó para fragmentar en columnas, y también cómo ha intentado convertirlo. –

+1

Ver la edición de arriba. – themenace92

+0

¿Qué salida esperas? – Kane

Respuesta

11

Es necesario utilizar CROSS APPLY

SELECT  
     TeamName = Foot.value('(name)[1]', 'varchar(100)'),  
     Manager = Foot.value('(@manager)', 'varchar(100)'),  
     Ground = Foot.value('(ground)[1]', 'varchar(100)') 
FROM  
    Storage S 
     CROSS APPLY data.nodes('/footballteams/team') AS Tbl(Foot) 

CROSS APPLY y OUTER APPLY permitirá unirse con eficacia a una colección de XML en el conjunto de datos actual.

+0

¡Funciona! Muchas gracias: D – themenace92

+0

My Pleasure! ¡Feliz de ayudar! –

+0

¿Puedo preguntar, es la diferencia entre la aplicación transversal y externa que externa incluirá NULL también? – themenace92

Cuestiones relacionadas