Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie kann man bei Verwendung von SqlDataReader doppelte Spaltennamen aus verschiedenen Quelltabellen/Unterabfragen anhand von Aliasnamen in einer SQL-Select-Anweisung unterscheiden?

Der andere Typ lag falsch, wie ich vermutet hatte, also beantworte ich meine eigene Frage.

In SQL Server 2012 (und wahrscheinlich früheren Versionen) habe ich festgestellt, dass, wenn ich „set showplan_xml on;“ aufrufe. auf eine beliebige Abfrage wie:

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

Das zurückgegebene XML enthält Folgendes als erste/oberste Ausgabeliste, die alle Spalten und nicht nur ihre Quelltabellen, sondern auch den Alias ​​ihrer Quell-Unterabfrage deutlich zeigt.

<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>

Da ich also in meiner Datenbank-API alle Abfragezeichenfolgen ordentlich in einem Wörterbuch speichere, kann ich beim Start der Anwendung tatsächlich eine Cache-Aufwärmphase durchführen, die sie alle mit xml_showplan durchläuft, die XML-Ausgabespalten der obersten Ebene parsen und dann haben eine vollständige Zuordnung von Tabellenaliasnamen und Spaltennamen zu ihrer Ausgabeordnungszahl.

Eigentlich habe ich hier einen kleinen Trick angewandt. Es ist eigentlich nicht der Alias ​​der Unterabfrage, sondern der Alias ​​der Basistabelle. Wenn Sie keinen Alias ​​in die Basistabelle aufnehmen, ist das Alias-Attribut nicht im XML vorhanden. Es ist jedoch sehr einfach sicherzustellen, dass Sie jedes Mal, wenn Sie auf eine tatsächliche Tabelle verweisen, ihr einen Alias ​​geben, der bewirken sollte, dass sie in XML ausgegeben wird, und los geht's.

Um es noch einmal deutlich zu machen, die Aliase bleiben bestehen, selbst wenn die Tabelle in einer Abfrage wie:

mit sich selbst verbunden wird

select * from Lessons a, Lessons b, Lessons c , was Folgendes erzeugt:

<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>

Wie Sie also sehen können, sind die Aliase tatsächlich intakt und abrufbar.