Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak odróżnić zduplikowane nazwy kolumn z różnych tabel/podkwerend źródłowych według aliasu w instrukcji SQL select podczas korzystania z SqlDataReader?

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przekazywanie parametru ciągu xml do procedury składowanej SQL Server

  2. Pobierz dane z procedury składowanej, która ma wiele zestawów wyników

  3. Filtrowanie duplikatów w tabeli bez klucza podstawowego

  4. Przekazywanie wielu parametrów wartości w SSRS do procedury składowanej

  5. Przechowywanie komunikatu raiserror z SqlServer w C#