Drugi facet się mylił, tak jak podejrzewałem, więc odpowiem na własne pytanie.
W SQL Server 2012 (i prawdopodobnie wcześniejszych wersjach) odkryłem, że jeśli wywołam 'set showplan_xml on;' na dowolne zapytanie, takie jak:
select * from (select * from Lessons a) a inner join (select * from LessonTypes b) b on a.LessonTypeID = b.ID;
Zwrócony kod XML zawiera następujące elementy jako swoją listę wyników pierwszego/najwyższego poziomu, która wyraźnie pokazuje wszystkie kolumny, a nie tylko ich tabele źródłowe, ale także alias ich podzapytania źródłowego.
<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 więc w moim API bazy danych, ponieważ przechowuję wszystkie ciągi zapytań w słowniku, mogę faktycznie przeprowadzić rozgrzewkę pamięci podręcznej podczas uruchamiania aplikacji, która uruchamia je wszystkie z włączonym xml_showplan, przeanalizować kolumny wyjściowe XML najwyższego poziomu, a następnie mieć pełne mapowanie aliasów tabeli i nazw kolumn na ich liczbę porządkową wyjścia.
Właściwie zastosowałem tutaj małą sztuczkę. W rzeczywistości nie jest to alias podzapytania, ale alias tabeli podstawowej. Jeśli nie uwzględnisz aliasu w tabeli podstawowej, oznacza to, że atrybut Alias nie występuje w kodzie XML. Jednak bardzo łatwo jest upewnić się, że za każdym razem, gdy odwołujesz się do rzeczywistej tabeli, nadajesz jej alias, który powinien spowodować wyprowadzenie jej do XML i gotowe.
Aby dotrzeć do celu, aliasy pozostają, nawet podczas łączenia tabeli z samą sobą w zapytaniu, takim jak:
select * from Lessons a, Lessons b, Lessons c
, co daje:
<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 widać, aliasy są w rzeczywistości nienaruszone i można je odzyskać.