Tôi đang viết một số mã để truy vấn một số DMV. Một số cột có thể tồn tại hoặc không tồn tại trong DMV tùy thuộc vào phiên bản SQL. Tôi tìm thấy một gợi ý thú vị trực tuyến làm thế nào để bỏ qua kiểm tra cụ thể bằng cách sử dụng CROSS APPLY
.
Truy vấn dưới đây là một ví dụ về mã để đọc DMV cho cột có khả năng bị thiếu. Mã tạo một giá trị mặc định cho cột và sử dụng CROSS APPLY
để trích xuất cột thực tế, nếu nó tồn tại, từ DMV.
Cột mà mã cố gắng trích xuất, BogusColumn, không tồn tại. Tôi hy vọng truy vấn bên dưới sẽ tạo ra lỗi về tên cột không hợp lệ ... nhưng không. Nó trả về NULL mà không có lỗi.
Tại sao mệnh đề CROSS ỨNG DỤNG bên dưới KHÔNG dẫn đến lỗi "tên cột không hợp lệ"?
declare @x int
select @x = b.BogusColumn
from
(
select cast(null as int) as BogusColumn
) a
cross apply
(
select BogusColumn from sys.dm_exec_sessions
) b;
select @x;
Nếu tôi chạy truy vấn CROSS APPLY
riêng:
select BogusColumn from sys.dm_exec_sessions;
Tôi nhận được một lỗi dự kiến về một tên cột không hợp lệ:
Msg 207, Level 16, State 1, Line 9
Invalid column name 'BogusColumn'.
Nếu tôi thay đổi tên cột DMV thành BogusColumn2 để làm cho nó là duy nhất, tôi sẽ gặp lỗi tên cột dự kiến:
select a.BogusColumn1, b.BogusColumn2
from
(
select cast(null as int) as BogusColumn1
) a
cross apply
(
select BogusColumn2 from sys.dm_exec_sessions
) b
Tôi đã thử nghiệm hành vi này trên các phiên bản SQL 2012 đến SQL 2017 và hành vi này phù hợp với tất cả các phiên bản.
IF @MajorVersion >= @SQL2016 AND @MinorVersion >= @SQL2016SP1 BEGIN /* write and execute dynamic SQL, etc. */ END