Consulta:
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
Plan de ejecución:
La rama superior tritura el XML en cuatro filas y la rama inferior obtiene el valor del atributo ID
.
Lo que me parece extraño es el número de filas devueltas por el operador Stream Aggregate. Las 2 filas que provienen del filtro son los ID
atributos del primer y segundo item
nodo en el XML. Stream Aggregate devuelve cuatro filas, una para cada fila de entrada, convirtiendo efectivamente la unión interna en una unión externa.
¿Es esto algo que Stream Aggregate hace también en otras circunstancias o es algo extraño cuando se realizan consultas XML?
No puedo ver ninguna pista en la versión XML del plan de consulta de que este Agregado de Stream debería comportarse de manera diferente a cualquier otro Agregado de Stream que haya notado antes.