sql >> Database >  >> RDS >> Sqlserver

Hoe onderscheid ik dubbele kolomnamen van verschillende brontabellen/subquery's door alias in een SQL-select-instructie bij gebruik van SqlDataReader?

De andere man had het mis, zoals ik al vermoedde, dus ik ga mijn eigen vraag beantwoorden.

In SQL Server 2012 (en waarschijnlijk eerdere versies), ontdekte ik dat als ik 'set showplan_xml on;' aanroep. op een willekeurige zoekopdracht zoals:

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

De geretourneerde XML bevat het volgende als uitvoerlijst op het eerste/hoogste niveau, die duidelijk alle kolommen toont, en niet alleen hun brontabellen, maar ook de alias van hun bronsubquery.

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

Dus, in mijn database-API, aangezien ik alle queryreeksen netjes in een woordenboek opsla, kan ik een cache-opwarming uitvoeren bij het starten van de applicatie die ze allemaal doorloopt met xml_showplan aan, de XML-uitvoerkolommen op het hoogste niveau ontleden, en dan hebben een volledige toewijzing van tabelalias en kolomnamen aan hun uitvoerordinaal.

Eigenlijk heb ik hier een trucje gebruikt. Het is eigenlijk niet de alias van de subquery, maar de alias van de basistabel. Als u geen alias in de basistabel opneemt, is het kenmerk Alias ​​niet aanwezig in de XML. Het is echter heel eenvoudig om ervoor te zorgen dat elke keer dat u naar een echte tabel verwijst, u deze een alias geeft, die ervoor moet zorgen dat deze wordt uitgevoerd naar de XML, en daar gaat u.

Gewoon om het punt naar huis te brengen, de aliassen blijven hangen, zelfs wanneer ze de tabel bij zichzelf voegen in een zoekopdracht zoals:

select * from Lessons a, Lessons b, Lessons c , die produceert:

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

Dus zoals je kunt zien, zijn de aliassen in feite intact en kunnen ze worden opgehaald.




  1. Ongeldige algemene gebruikers- of rolnaam

  2. De conversie van een varchar-gegevenstype naar een datetime-gegevenstype resulteerde in een waardefout buiten het bereik

  3. Ik krijg NotImplementedError wanneer ik een voorbereide instructie probeer te doen met mysql python-connector

  4. Conditional Split Transformation:gegevens exporteren van SQL Server naar Oracle- en MySQL-databases