Không có gì đảm bảo cho hành vi này.
Một ví dụ về đánh giá đoản mạch không xảy ra với expr1 AND expr2
là
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)
là false
(nghĩa là And
biểu thức -ed phải là False
) nhưng kết quả IO cho thấy điều kiện thứ hai vẫn được đánh giá.
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.
Máy chủ SQL có thể làm điều này mặc dù. Tôi thấy điều này trong bài kiểm tra của mình
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'
Đầu ra là
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)
Hiển thị spt_values
không bao giờ được truy cập.
Điều này được thực hiện bởi một điều kiện vị ngữ chuyển qua trong kế hoạch thực thi. Có một số thông tin về chúng ở đây.
Nếu vị từ passthru đánh giá là true, thì phép nối trả về hàng .... Nếu vị từ passthrupredicate đánh giá là false, phép nối vẫn tiến hành bình thường