Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana cara membedakan nama kolom duplikat dari tabel/subkueri sumber yang berbeda dengan alias dalam pernyataan pilih SQL saat menggunakan SqlDataReader?

Orang lain salah seperti yang saya duga, jadi saya akan menjawab pertanyaan saya sendiri.

Di SQL Server 2012 (dan mungkin versi sebelumnya), saya menemukan bahwa jika saya memanggil 'set showplan_xml on;' pada permintaan sewenang-wenang seperti:

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

XML yang dikembalikan menyertakan yang berikut ini sebagai OutputList tingkat pertama/atasnya, yang dengan jelas menunjukkan semua kolom, dan tidak hanya tabel sumbernya tetapi juga alias subkueri sumbernya.

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

Jadi, di API database saya, karena saya menyimpan semua string kueri dengan rapi di dalam kamus, saya sebenarnya dapat melakukan pemanasan cache di awal aplikasi yang menjalankan semuanya dengan xml_showplan aktif, parsing kolom output tingkat atas XML, dan kemudian memiliki pemetaan lengkap dari alias tabel dan nama kolom ke ordinal keluarannya.

Sebenarnya, saya telah menggunakan sedikit trik di sini. Ini sebenarnya bukan alias dari subquery, tetapi alias dari tabel dasar. Jika Anda tidak menyertakan alias pada tabel dasar, maka atribut Alias ​​​​tidak ada dalam XML. Namun, sangat mudah untuk memastikan bahwa setiap kali Anda mereferensikan tabel yang sebenarnya, Anda memberinya alias, yang akan menyebabkannya menjadi keluaran ke XML, dan begitulah.

Hanya untuk mengarahkan poin ke rumah, alias tetap ada, bahkan saat menggabungkan tabel ke dirinya sendiri dalam kueri seperti:

select * from Lessons a, Lessons b, Lessons c , yang menghasilkan:

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

Jadi seperti yang Anda lihat, alias sebenarnya utuh dan dapat diambil kembali.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pernyataan SQL untuk memilih grup yang berisi semua kumpulan nilai

  2. Bagaimana cara mengatur properti SSRS ConsumeContainerWhitespace di Visual Studio 2008?

  3. Kembalikan Daftar Semua Pemicu Server di SQL Server

  4. Apa itu ISO_year di sql-server

  5. Membuat Tampilan dari Tabel Anak Terkait