Запит:
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 плану запитів про те, що ця потокова агрегація повинна вести себе інакше, ніж будь-яка інша потокова агрегата, яку я помічав раніше.