Requete:
declare @X xml = '
<item ID = "0"/>
<item ID = "1"/>
<item/>
<item/>';
select I.X.value('@ID', 'int')
from @X.nodes('/item') as I(X);
Résultat:
-----------
0
1
NULL
NULL
Plan d'exécution:
La branche supérieure déchiquette le XML en quatre lignes et la branche inférieure récupère la valeur de l'attribut ID
.
Ce qui me semble étrange, c'est le nombre de lignes renvoyées par l'opérateur Stream Aggregate. Les 2 lignes qui proviennent du filtre sont l' ID
attribut des premier et deuxième item
nœuds du XML. Le Stream Aggregate renvoie quatre lignes, une pour chaque ligne d'entrée, transformant ainsi la jointure interne en jointure externe.
Est-ce quelque chose que Stream Aggregate fait également dans d'autres circonstances ou est-ce juste quelque chose d'étrange qui se produit lors des requêtes XML?
Je ne vois aucun indice dans la version XML du plan de requête selon lequel cet agrégat de flux devrait se comporter différemment de tout autre agrégat de flux que j'ai remarqué auparavant.