Inquerir:
declare @X xml = '
<item ID = "0"/>
<item ID = "1"/>
<item/>
<item/>';
select I.X.value('@ID', 'int')
from @X.nodes('/item') as I(X);
Resultado:
-----------
0
1
NULL
NULL
Plano de execução:
A ramificação superior fragmenta o XML em quatro linhas e a ramificação inferior busca o valor do atributo ID
.
O que me parece estranho é o número de linhas retornadas do operador Stream Aggregate. As 2 linhas que vêm do filtro são o ID
atributo do primeiro e do segundo item
nós no XML. O Stream Aggregate retorna quatro linhas, uma para cada linha de entrada, transformando efetivamente a junção interna em uma junção externa.
Isso também é algo que o Stream Aggregate faz em outras circunstâncias ou é algo estranho acontecendo ao fazer consultas XML?
Não vejo nenhuma dica na versão XML do plano de consulta de que este Stream Aggregate deve se comportar de maneira diferente de qualquer outro Stream Aggregate que eu tenha notado antes.