sql >> Databáze >  >> RDS >> Sqlserver

Jak odlišit duplicitní názvy sloupců z různých zdrojových tabulek/poddotazů podle aliasu v příkazu SQL select při použití SqlDataReader?

Ten druhý se mýlil, jak jsem tušil, takže odpovím na svou vlastní otázku.

V SQL Server 2012 (a pravděpodobně dřívějších verzích) jsem zjistil, že když zavolám 'set showplan_xml on;' na libovolný dotaz jako:

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

Vrácený XML obsahuje následující jako svůj první/nejvyšší OutputList, který jasně zobrazuje všechny sloupce a nejen jejich zdrojové tabulky, ale i alias jejich zdrojového poddotazu.

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

Takže v mém databázovém API, protože ukládám všechny řetězce dotazů úhledně do slovníku, mohu při spuštění aplikace skutečně provést zahřátí mezipaměti, které je všechny provede se zapnutým xml_showplan, analyzovat výstupní sloupce nejvyšší úrovně XML a poté mít kompletní mapování aliasů tabulek a názvů sloupců na jejich výstupní pořadové číslo.

Vlastně jsem zde použil malý trik. Ve skutečnosti to není alias poddotazu, ale alias základní tabulky. Pokud do základní tabulky nezahrnete alias, pak atribut Alias ​​není v XML přítomen. Je však velmi jednoduché ujistit se, že pokaždé, když odkazujete na skutečnou tabulku, dáte jí alias, který by měl způsobit její výstup do XML, a je to.

Abychom došli k cíli, aliasy zůstanou zachovány, i když se tabulka připojí k sobě v dotazu, jako je:

select * from Lessons a, Lessons b, Lessons c , která produkuje:

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

Jak tedy vidíte, aliasy jsou ve skutečnosti neporušené a lze je získat.




  1. docker mysqld:nelze číst adresář '/etc/mysql/mysql.conf.d' (os errno 2 - žádný takový soubor nebo adresář)

  2. Řešení problémů generátoru číselných řad – Část 5

  3. Vytvoření dynamického spouštěče Mysql v uložené proceduře

  4. Alternativa k operátoru in v mysql