sql >> Databasteknik >  >> RDS >> Sqlserver

Hur skiljer man dubblettkolumnnamn från olika källtabeller/underfrågor med alias i en SQL select-sats när man använder SqlDataReader?

Den andra killen hade fel som jag misstänkte, så jag ska svara på min egen fråga.

I SQL Server 2012 (och förmodligen tidigare versioner) upptäckte jag att om jag anropar 'set showplan_xml on;' på en godtycklig fråga som:

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

Den returnerade XML-filen inkluderar följande som sin första/toppnivå OutputList, som tydligt visar alla kolumner, och inte bara deras källtabeller utan aliaset för deras källunderfråga.

<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 mitt databas-API, eftersom jag lagrar alla frågesträngar snyggt i en ordbok, kan jag faktiskt utföra en cache-uppvärmning vid applikationsstart som kör igenom dem med xml_showplan på, analysera XML-utdatakolumnerna på toppnivå och sedan har en fullständig mappning av tabellalias och kolumnnamn till deras utdataordinal.

Jag har faktiskt använt ett litet knep här. Det är faktiskt inte aliaset för underfrågan, utan aliaset för bastabellen. Om du inte inkluderar ett alias i bastabellen, så finns inte Alias-attributet i XML. Det är dock väldigt enkelt att se till att varje gång du refererar till en faktisk tabell, ger du den ett alias, som borde göra att den matas ut till XML, och så är det.

Bara för att driva poängen hem, aliasen fastnar, även när man sammanfogar tabellen till sig själv i en fråga som:

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

<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 är aliasen i själva verket intakta och återtagbara.




  1. MySQL pris &aktiejämförelse

  2. SQL Server 2008 skickar datatyp som parameter för funktion

  3. Använda en HTML-kryssruta för att sätta 1 eller 0 i en MySQL-tabell

  4. MySQL - Hur man skapar en ny tabell som är en koppling på primärnyckeln till två befintliga tabeller