2012-03-26 20 views
10

Tengo una tabla RDCAlerts con los datos siguientes en una columna de tipo XML llamados AliasesValue:Volviendo varias filas de la columna XML consulta en SQL Server 2008

<aliases> 
    <alias> 
    <aliasType>AKA</aliasType> 
    <aliasName>Pramod Singh</aliasName> 
    </alias> 
    <alias> 
    <aliasType>AKA</aliasType> 
    <aliasName>Bijoy Bora</aliasName> 
    </alias> 
</aliases> 

me gustaría crear una consulta que devuelve dos filas - una para cada alias y he probado la siguiente consulta:

SELECT 
    AliasesValue.query('data(/aliases/alias/aliasType)'), 
    AliasesValue.query('data(/aliases/alias/aliasName)'), 
FROM [RdcAlerts] 

pero devuelve sólo una fila de la siguiente manera:

Método

Respuesta

15

Mira las .nodes() en los libros en pantalla:

DECLARE @r TABLE (AliasesValue XML) 
INSERT INTO @r 
SELECT '<aliases> <alias>  <aliasType>AKA</aliasType>  <aliasName>Pramod Singh</aliasName> </alias> <alias>  <aliasType>AKA</aliasType>  <aliasName>Bijoy Bora</aliasName> </alias> </aliases> ' 


SELECT c.query('data(aliasType)'), c.query('data(aliasName)') 
FROM @r r CROSS APPLY AliasesValue.nodes('aliases/alias') x(c) 
+0

¡Belleza! Muchas gracias, mucho gusto =) –

+0

Han pasado 5 años desde que escribiste tu respuesta ... y me ayudó a resolver un problema que estaba teniendo. ¡Gracias! – PKD

+0

De nada :) –

12

Es necesario utilizar la instrucción CROSS APPLY junto con la función .nodes() para obtener múltiples filas devueltas.

select 
    a.alias.value('(aliasType/text())[1]', 'varchar(20)') as 'aliasType', 
    a.alias.value('(aliasName/text())[1]', 'varchar(20)') as 'aliasName' 
from 
    RDCAlerts r 
    cross apply r.AliasesValue.nodes('/aliases/alias') a(alias) 
+0

Saludos, lo aprecio ;-) –

Cuestiones relacionadas