sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan adskiller man duplikerede kolonnenavne fra forskellige kildetabeller/underforespørgsler ved alias i en SQL select-sætning, når man bruger SqlDataReader?

Den anden fyr tog fejl, som jeg havde mistanke om, så jeg vil svare på mit eget spørgsmål.

I SQL Server 2012 (og sandsynligvis tidligere versioner) fandt jeg ud af, at hvis jeg kalder 'set showplan_xml on;' på en vilkårlig forespørgsel som:

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

Den returnerede XML inkluderer følgende som dens første/top-niveau OutputList, som tydeligt viser alle kolonner og ikke kun deres kildetabeller, men aliaset for deres kildeunderforespørgsel.

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

Så i min database-API, da jeg gemmer alle forespørgselsstrenge pænt i en ordbog, kan jeg faktisk udføre en cache-opvarmning ved applikationsstart, der kører dem alle igennem med xml_showplan på, parse XML-outputkolonnerne på øverste niveau og derefter har en komplet tilknytning af tabelalias og kolonnenavne til deres outputordinal.

Faktisk har jeg brugt et lille trick her. Det er faktisk ikke underforespørgslens alias, men basistabellens alias. Hvis du ikke inkluderer et alias i basistabellen, er attributten Alias ​​ikke til stede i XML. Det er dog meget simpelt at sikre sig, at hver gang du refererer til en faktisk tabel, giver du den et alias, som skulle få den til at blive outputtet til XML, og så er det.

Bare for at få pointen hjem, hænger aliasserne fast, selv når man forbinder bordet med sig selv i en forespørgsel som:

select * from Lessons a, Lessons b, Lessons c , som producerer:

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

Så som du kan se, er aliasserne faktisk intakte og kan genfindes.




  1. Hvad er datotypen i npgsql?

  2. hent post i rækkefølge med IN-klausul - med duplikerede værdier i IN-klausul

  3. MySQL:Indstil til standardværdi ved opdatering

  4. MySQL på dubletnøgle... få eksisterende ID?