Возврат нескольких строк из запроса столбца XML в SQL Server 2008 - PullRequest
14 голосов
/ 26 марта 2012

У меня есть таблица RDCAlerts со следующими данными в столбце типа XML с именем AliasesValue:

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

Я хотел бы создать запрос, который возвращает две строки - одну длякаждый псевдоним, и я пробовал следующий запрос:

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

, но он возвращает только одну строку, как это:

AKA AKA | Pramod Singh Bijoy Bora

Ответы [ 2 ]

20 голосов
/ 26 марта 2012

Посмотрите на метод .nodes () в 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)
15 голосов
/ 26 марта 2012

Вам нужно использовать оператор 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...