Pertanyaan:
declare @X xml = '
<item ID = "0"/>
<item ID = "1"/>
<item/>
<item/>';
select I.X.value('@ID', 'int')
from @X.nodes('/item') as I(X);
Hasil:
-----------
0
1
NULL
NULL
Rencana eksekusi:
Cabang atas merobek XML menjadi empat baris dan cabang bawah mengambil nilai untuk atribut ID
.
Apa yang menurut saya ganjil adalah jumlah baris yang dikembalikan dari operator Agregat Stream. 2 baris yang berasal dari Filter adalah ID
atribut dari item
node pertama dan kedua dalam XML. Agregat Stream mengembalikan empat baris, satu untuk setiap baris input, secara efektif mengubah Inner Join menjadi Outer Join.
Apakah ini sesuatu yang Stream Aggregate lakukan dalam keadaan lain juga atau hanya sesuatu yang aneh terjadi ketika melakukan permintaan XML?
Saya tidak dapat melihat petunjuk apa pun dalam versi XML dari rencana kueri bahwa Agregat Stream ini harus berperilaku berbeda dari Agregat Stream lain yang saya perhatikan sebelumnya.
sumber