Trong quá trình phân tích cú pháp , SQL Server gọi sqllang!DecodeCompOp
để xác định loại toán tử so sánh có mặt:
Điều này xảy ra tốt trước khi bất cứ điều gì trong trình tối ưu hóa được tham gia.
Từ các toán tử so sánh (Transact-SQL)
Truy tìm mã bằng trình gỡ lỗi và ký hiệu công khai *, sqllang!DecodeCompOp
trả về giá trị trong thanh ghi eax
** như sau:
╔════╦══════╗
║ Op ║ Code ║
╠════╬══════╣
║ < ║ 1 ║
║ = ║ 2 ║
║ <= ║ 3 ║
║ !> ║ 3 ║
║ > ║ 4 ║
║ <> ║ 5 ║
║ != ║ 5 ║
║ >= ║ 6 ║
║ !< ║ 6 ║
╚════╩══════╝
!=
và <>
cả hai trả về 5, vì vậy không thể phân biệt trong tất cả các hoạt động sau này (bao gồm cả biên dịch & tối ưu hóa).
Mặc dù thứ yếu so với điểm trên, cũng có thể (ví dụ: sử dụng cờ theo dõi không có giấy tờ 8605) để xem cây logic được chuyển đến trình tối ưu hóa để xác nhận rằng cả hai !=
và <>
ánh xạ tới ScaOp_Comp x_cmpNe
(không so sánh toán tử vô hướng bằng nhau).
Ví dụ:
SELECT P.ProductID FROM Production.Product AS P
WHERE P.ProductID != 4
OPTION (QUERYTRACEON 3604, QUERYTRACEON 8605);
SELECT P.ProductID FROM Production.Product AS P
WHERE P.ProductID <> 4
OPTION (QUERYTRACEON 3604, QUERYTRACEON 8605);
cả hai sản xuất:
LogOp_Project QCOL: [P] .Sản phẩm
Đăng nhập
LogOp_Get TBL: Sản xuất .Sản phẩm (bí danh TBL: P)
ScaOp_Comp x_cmpNe
ScaOp_Identifier QCOL: [P] .Sản phẩm
ScaOp_Const TI (int, ML = 4) XVAR (int, Không sở hữu, Giá trị = 4)
AncOp_PrjList
Chú thích
* Tôi sử dụng WinDbg ; các trình sửa lỗi khác có sẵn. Biểu tượng công khai có sẵn thông qua máy chủ biểu tượng Microsoft thông thường. Để biết thêm thông tin, hãy xem Tìm hiểu sâu hơn về SQL Server bằng cách sử dụng các nhóm nhỏ của Nhóm tư vấn khách hàng SQL Server và Gỡ lỗi máy chủ SQL với WinDbg - Giới thiệu của Klaus Aschenbrenner.
** Sử dụng EAX trên các dẫn xuất Intel 32 bit cho các giá trị trả về từ một hàm là phổ biến. Chắc chắn Win32 ABI làm theo cách đó và tôi khá chắc chắn rằng nó kế thừa thực tiễn đó từ thời MS-DOS cũ, nơi AX được sử dụng cho cùng mục đích - Michael Kjorling