Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment différencier les noms de colonnes en double de différentes tables/sous-requêtes source par alias dans une instruction de sélection SQL lors de l'utilisation de SqlDataReader ?

L'autre gars s'est trompé comme je le soupçonnais, alors je vais répondre à ma propre question.

Dans SQL Server 2012 (et probablement les versions antérieures), j'ai constaté que si j'appelais 'set showplan_xml on;' sur une requête arbitraire comme :

select * from (select * from Lessons a) a inner join (select * from LessonTypes b) b on a.LessonTypeID = b.ID;

Le XML renvoyé inclut les éléments suivants en tant que OutputList de premier/niveau supérieur, qui affiche clairement toutes les colonnes, et non seulement leurs tables source, mais aussi l'alias de leur sous-requête source.

<OutputList>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[a]" Column="ID"/>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[a]" Column="Name"/>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[a]" Column="Description"/>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[a]" Column="Enabled"/>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[a]" Column="LessonTypeID"/>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[LessonTypes]" Alias="[b]" Column="ID"/>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[LessonTypes]" Alias="[b]" Column="Name"/>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[LessonTypes]" Alias="[b]" Column="Description"/>
 </OutputList>

Ainsi, dans mon API de base de données, puisque je stocke soigneusement toutes les chaînes de requêtes dans un dictionnaire, je peux en fait effectuer un préchauffage du cache au démarrage de l'application qui les exécute tout au long avec xml_showplan activé, analyser les colonnes de sortie XML de niveau supérieur, puis avoir un mappage complet des alias de table et des noms de colonne à leur ordinal de sortie.

En fait, j'ai utilisé une petite astuce ici. Ce n'est pas réellement l'alias de la sous-requête, mais l'alias de la table de base. Si vous n'incluez pas d'alias dans la table de base, l'attribut Alias ​​n'est pas présent dans le XML. Cependant, il est très simple de s'assurer que chaque fois que vous faites référence à une table réelle, vous lui donnez un alias, ce qui devrait entraîner sa sortie vers le XML, et voilà.

Juste pour enfoncer le clou, les alias restent, même en joignant la table à elle-même dans une requête telle que :

select * from Lessons a, Lessons b, Lessons c , qui produit :

<OutputList>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[a]" Column="ID"/>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[a]" Column="Name"/>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[a]" Column="Description"/>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[a]" Column="Enabled"/>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[a]" Column="LessonTypeID"/>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[b]" Column="ID"/>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[b]" Column="Name"/>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[b]" Column="Description"/>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[b]" Column="Enabled"/>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[b]" Column="LessonTypeID"/>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[c]" Column="ID"/>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[c]" Column="Name"/>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[c]" Column="Description"/>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[c]" Column="Enabled"/>
    <ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[c]" Column="LessonTypeID"/>
</OutputList>

Ainsi, comme vous pouvez le constater, les alias sont en fait intacts et récupérables.