2012-03-26 2 views
10

I RDCAlerts mit den folgenden Daten in einer Spalte vom Typ XML genannt AliasesValue eine Tabelle haben:Zurück mehrere Zeilen von Abfragen von XML-Spalte in SQL Server 2008

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

Ich möchte eine Abfrage erstellen, die zwei Zeilen zurückgibt - eine für jeden Alias ​​und ich habe die folgende Abfrage versucht:

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

aber es gibt nur eine Zeile wie folgt aus:

AKA AKA | Pramod Singh Bijoy Bora 

Antwort

15

Blick auf die .nodes() -Methode in der Onlinedokumentation:

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

Schönheit! Vielen Dank, sehr geschätzt =) –

+0

Es ist 5 Jahre, nachdem Sie Ihre Antwort geschrieben haben ... und es hat mir nur geholfen, ein Problem zu lösen, das ich hatte. Vielen Dank! – PKD

+0

Sie sind willkommen :) –

12

Sie müssen zusammen mit der .nodes() Funktion der CROSS APPLY Anweisung verwenden, um mehrere Zeilen zurückgegeben zu bekommen.

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

Prost, schätze es ;-) –

Verwandte Themen