Ayrıştırma sırasında , SQL Server sqllang!DecodeCompOp
mevcut karşılaştırma işlecinin türünü belirlemek için çağırır :
Bu, optimize edicideki herhangi bir şey dahil olmadan önce iyi bir şekilde gerçekleşir.
Gönderen Karşılaştırma Operatörleri (Transact-SQL)
Bir hata ayıklayıcı ve genel semboller * kullanarak kodun izlenmesi, sqllang!DecodeCompOp
kayıt defterinde eax
** aşağıdaki gibi bir değer döndürür :
╔════╦══════╗
║ Op ║ Code ║
╠════╬══════╣
║ < ║ 1 ║
║ = ║ 2 ║
║ <= ║ 3 ║
║ !> ║ 3 ║
║ > ║ 4 ║
║ <> ║ 5 ║
║ != ║ 5 ║
║ >= ║ 6 ║
║ !< ║ 6 ║
╚════╩══════╝
!=
ve <>
her ikisi de 5 döndürür, bu nedenle sonraki tüm işlemlerde (derleme ve optimizasyon dahil) ayırt edilemez .
Yukarıdaki noktaya ikincil rağmen, aynı zamanda mümkündür (örn belgesiz izleme bayrağı 8605 kullanarak) her iki onaylamak için optimize edici geçirilen mantıksal ağaca bakmak !=
ve <>
eşleme ScaOp_Comp x_cmpNe
(eşit değil skaler operatörü karşılaştırma).
Örneğin:
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);
her ikisi de üretmek:
LogOp_Project QCOL: [P] .ProductID
LogOp_Select
LogOp_Get TBL: Üretim.Ürün (takma ad TBL: P)
ScaOp_Comp x_cmpNe
ScaOp_Identifier QCOL: [P]. Ürün Kimliği
ScaOp_Const TI (int, ML = 4) XVAR (int, Sahip Değil, Değer = 4)
AncOp_PrjList
Dipnotlar
* WinDbg kullanıyorum ; diğer hata ayıklayıcıları mevcuttur. Genel semboller normal Microsoft sembol sunucusu üzerinden kullanılabilir. Daha fazla bilgi için bkz. Mini Sunucuları kullanarak SQL Server Müşteri Danışma Ekibi ve WinDbg ile Hata Ayıklama ile SQL Server'da daha derinlere bakma - Klaus Aschenbrenner tarafından yapılan bir giriş .
** Bir fonksiyondan dönüş değerleri için 32-bit Intel türevlerinde EAX kullanımı yaygındır. Tabii ki Win32 ABI bu şekilde yapıyor ve eminim ki AX'in aynı amaç için kullanıldığı eski MS-DOS günlerinde bu alıştırmayı miras alıyor - Michael Kjörling