2016-10-05 2 views
1

Ниже приведен пример, где я пытаюсь получить результат в виде двух строк с одинаковым именем ClaimNo с разными aliasType и aliasName.Чтение XML в SQL, в котором есть одна до многих комбинаций

Текущий результат выглядит this- enter image description here

DECLARE @r TABLE (AliasesValue XML) 
INSERT INTO @r 
SELECT '<aliases> <ClaimsNotificationAddRq><Claim><ClaimNo>123</ClaimNo> <alias>  <aliasType>AKA</aliasType>  <aliasName>Pramod Singh</aliasName> </alias> <alias>  <aliasType>AKA</aliasType>  <aliasName>Bijoy Bora</aliasName> </alias></Claim></ClaimsNotificationAddRq> </aliases> ' 


SELECT c.query('data(Claim/ClaimNo)'), c.query('data(Claim/alias/aliasType)'), c.query('data(Claim/alias/aliasName)') 

FROM @r r CROSS APPLY AliasesValue.nodes('aliases/ClaimsNotificationAddRq') x(c) 

ответ

0

Попробуйте как этот

DECLARE @r TABLE (AliasesValue XML) 
INSERT INTO @r 
SELECT '<aliases> 
    <ClaimsNotificationAddRq> 
    <Claim> 
     <ClaimNo>123</ClaimNo> 
     <alias> 
     <aliasType>AKA</aliasType> 
     <aliasName>Pramod Singh</aliasName> 
     </alias> 
     <alias> 
     <aliasType>AKA</aliasType> 
     <aliasName>Bijoy Bora</aliasName> 
     </alias> 
    </Claim> 
    </ClaimsNotificationAddRq> 
</aliases>'; 

SELECT c.value('(ClaimNo)[1]','int') AS ClaimNo 
     ,a.value('(aliasType)[1]','nvarchar(max)') AS AliasType 
     ,a.value('(aliasName)[1]','nvarchar(max)') AS AliasName 
FROM @r r 
CROSS APPLY AliasesValue.nodes('/aliases/ClaimsNotificationAddRq/Claim') x(c) 
CROSS APPLY c.nodes('alias') AS y(a) 

Результат

123 AKA Pramod Singh 
123 AKA Bijoy Bora 

Первый вызов .nodes() получает вас на уровне один <Claim>. Второй вызов получит все <alias> -ноды ниже текущего <Claim> -элемент.