Tidak ada jaminan untuk perilaku ini.
Contoh evaluasi korsleting tidak terjadi dengan expr1 AND expr2
adalah
SET STATISTICS IO ON
IF EXISTS(SELECT COUNT(*) FROM master..spt_monitor HAVING COUNT(*)=2)
AND EXISTS (SELECT COUNT(*) FROM master..spt_values HAVING COUNT(*)=1)
PRINT 'Y'
EXISTS(SELECT COUNT(*) FROM master..spt_monitor HAVING COUNT(*)=2)
adalah false
(artinya And
-ed ekspresi harus False
) tetapi hasil IO menunjukkan kondisi kedua masih dievaluasi.
Table 'spt_values'. Scan count 1, logical reads 14, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'spt_monitor'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server bisa melakukan ini sekalipun. Saya melihat ini dalam pengujian saya
SET STATISTICS IO ON
DECLARE @p1 BIT = NULL
IF ( @p1 = 1
AND EXISTS(SELECT *
FROM master..spt_values) )
PRINT '1'
ELSE IF ( @p1 = 0
AND EXISTS(SELECT *
FROM master..spt_values) )
PRINT '2'
Outputnya adalah
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
(1 row(s) affected)
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
(1 row(s) affected)
Menampilkan spt_values
tidak pernah diakses.
Hal ini diimplementasikan dengan kondisi predikat pass through dalam rencana eksekusi. Ada beberapa informasi tentang itu di sini.
Jika predikat passthru bernilai true, join akan mengembalikan baris.... Jika passthrupredicate bernilai false, join akan berjalan normal