从SQL Server 2008中的查询XML列返回多行

Hug*_*rte 15 xml sql t-sql sql-server-2008

RDCAlerts在一个XML名为的列中有一个包含以下数据的表AliasesValue:

<aliases>
  <alias>
    <aliasType>AKA</aliasType>
    <aliasName>Pramod Singh</aliasName>
  </alias>
  <alias>
    <aliasType>AKA</aliasType>
    <aliasName>Bijoy Bora</aliasName>
  </alias>
</aliases>
Run Code Online (Sandbox Code Playgroud)

我想创建一个返回两行的查询 - 每个别名一个,我尝试了以下查询:

SELECT
   AliasesValue.query('data(/aliases/alias/aliasType)'),
   AliasesValue.query('data(/aliases/alias/aliasName)'),
FROM [RdcAlerts]
Run Code Online (Sandbox Code Playgroud)

但它只返回一行,如下所示:

AKA AKA | Pramod Singh Bijoy Bora
Run Code Online (Sandbox Code Playgroud)

Stu*_*rth 22

查看联机丛书中的.nodes()方法:

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)
Run Code Online (Sandbox Code Playgroud)


Der*_*omm 17

您需要将该CROSS APPLY语句与.nodes()函数一起使用以获取返回的多行.

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)
Run Code Online (Sandbox Code Playgroud)