Запрос:
declare @X xml = '
<item ID = "0"/>
<item ID = "1"/>
<item/>
<item/>';
select I.X.value('@ID', 'int')
from @X.nodes('/item') as I(X);
Результат:
-----------
0
1
NULL
NULL
План выполнения:
Верхняя ветвь разделяет XML на четыре строки, а нижняя ветвь выбирает значение для атрибута ID
.
То, что кажется мне странным, это количество строк, возвращаемых оператором Stream Aggregate. 2 строки из фильтра - это ID
атрибут первого и второго item
узлов в XML. Агрегат потока возвращает четыре строки, по одной для каждой входной строки, эффективно превращая внутреннее соединение во внешнее соединение.
Это то, что Stream Aggregate делает и в других обстоятельствах, или это просто что-то странное происходит при выполнении запросов XML?
Я не вижу никаких намеков в XML-версии плана запроса, что этот агрегат потока должен вести себя иначе, чем любой другой агрегат потока, который я заметил ранее.