Pytanie:
declare @X xml = '
<item ID = "0"/>
<item ID = "1"/>
<item/>
<item/>';
select I.X.value('@ID', 'int')
from @X.nodes('/item') as I(X);
Wynik:
-----------
0
1
NULL
NULL
Plan wykonania:
Górna gałąź niszczy XML do czterech wierszy, a dolna gałąź pobiera wartość atrybutu ID
.
To, co wydaje mi się dziwne, to liczba wierszy zwróconych przez operatora Stream Aggregate. 2 wiersze pochodzące z filtru to ID
atrybut z pierwszego i drugiego item
węzła w pliku XML. Agregacja strumienia zwraca cztery wiersze, po jednym dla każdego wiersza wejściowego, skutecznie zmieniając łączenie wewnętrzne w łączenie zewnętrzne.
Czy jest to coś, co robi agregacja strumieniowa również w innych okolicznościach, czy może jest to po prostu coś dziwnego podczas wykonywania zapytań XML?
W wersji XML planu zapytań nie widzę żadnych wskazówek, że agregacja strumieniowa powinna zachowywać się inaczej niż jakakolwiek inna agregacja strumieniowa, którą zauważyłem wcześniej.