Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để phân biệt các tên cột trùng lặp với các bảng nguồn / truy vấn con khác nhau bằng bí danh trong câu lệnh SQL select khi sử dụng SqlDataReader?

Anh chàng kia đã sai như tôi nghi ngờ, vì vậy tôi sẽ trả lời câu hỏi của chính mình.

Trong SQL Server 2012 (và có thể là các phiên bản trước đó), tôi thấy rằng nếu tôi gọi 'set showplan_xml on;' trên một truy vấn tùy ý như:

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

XML được trả về bao gồm phần sau là Danh sách đầu ra cấp đầu tiên / cấp cao nhất của nó, hiển thị rõ ràng tất cả các cột và không chỉ các bảng nguồn của chúng mà còn là bí danh của truy vấn con nguồn của chúng.

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

Vì vậy, trong API cơ sở dữ liệu của tôi, vì tôi lưu trữ gọn gàng tất cả các chuỗi truy vấn trong một từ điển, tôi thực sự có thể thực hiện khởi động bộ nhớ cache khi khởi động ứng dụng để chạy tất cả chúng thông qua khi bật xml_showplan, phân tích cú pháp các cột đầu ra cấp cao nhất của XML và sau đó có một ánh xạ hoàn chỉnh của bí danh bảng và tên cột với thứ tự đầu ra của chúng.

Trên thực tế, tôi đã sử dụng một mẹo nhỏ ở đây. Nó không thực sự là bí danh của truy vấn con, mà là bí danh của bảng cơ sở. Nếu bạn không bao gồm bí danh trên bảng cơ sở, thì thuộc tính Bí danh không có trong XML. Tuy nhiên, rất đơn giản để đảm bảo rằng mỗi khi bạn tham chiếu đến một bảng thực tế, bạn đặt cho nó một bí danh, điều này sẽ khiến nó được xuất ra XML và bạn hoàn thành.

Chỉ để đưa điểm về nhà, bí danh vẫn dính, ngay cả khi tham gia bảng với chính nó trong một truy vấn, chẳng hạn như:

select * from Lessons a, Lessons b, Lessons c , nơi sản xuất:

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

Vì vậy, như bạn có thể thấy, các bí danh trên thực tế vẫn còn nguyên vẹn và có thể truy xuất được.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server - Các cột Tổng hợp động phức tạp

  2. Tôi muốn Giờ, Tối thiểu, chênh lệch thứ hai so với hai ngày hẹn hò

  3. Cách lấy mô hình khôi phục của cơ sở dữ liệu trong SQL Server bằng T-SQL

  4. VarBinary vs Image Kiểu dữ liệu SQL Server để lưu trữ dữ liệu nhị phân?

  5. Làm cách nào để chèn nhiều hàng trong SQL bằng các thủ tục được lưu trữ?