Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Returning multiple rows from querying XML column in SQL Server 2008

I have a table RDCAlerts with the following data in a column of type XML called AliasesValue:

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

I would like to create a query that returns two rows - one for each alias and I've tried the following query:

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

but it returns just one row like this:

AKA AKA | Pramod Singh Bijoy Bora
like image 218
Hugo Forte Avatar asked Mar 26 '12 13:03

Hugo Forte


2 Answers

Look at the .nodes() method in Books Online:

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)
like image 86
Stuart Ainsworth Avatar answered Oct 18 '22 14:10

Stuart Ainsworth


You need to use the CROSS APPLY statement along with the .nodes() function to get multiple rows returned.

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)
like image 45
Derek Kromm Avatar answered Oct 18 '22 16:10

Derek Kromm