Возвращение нескольких строк из запроса столбца XML в 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>
Я хотел бы создать запрос, который возвращает две строки - по одному для каждого псевдонима, и я пробовал следующий запрос:
SELECT
AliasesValue.query('data(/aliases/alias/aliasType)'),
AliasesValue.query('data(/aliases/alias/aliasName)'),
FROM [RdcAlerts]
но он возвращает только одну строку следующим образом:
AKA AKA | Pramod Singh Bijoy Bora
Ответы
Ответ 1
Посмотрите на метод .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)
Ответ 2
Вам нужно использовать оператор 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)