Er is geen garantie voor dit gedrag.
Een voorbeeld van kortsluiting evaluatie niet gebeurt met expr1 AND expr2
is
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'
De EXISTS(SELECT COUNT(*) FROM master..spt_monitor HAVING COUNT(*)=2)
is false
(wat betekent de And
-ed expressie moet False
zijn ) maar de IO-resultaten laten zien dat de tweede voorwaarde nog steeds werd geëvalueerd.
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 kan doe dit toch. Ik zie dit in mijn test
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'
De uitvoer is
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)
Toont spt_values
is nooit geopend.
Dit wordt geïmplementeerd door een doorgeefpredikaatvoorwaarde in het uitvoeringsplan. Er is hier wat informatie over.
Als het passthru-predicaat true oplevert, retourneert de join de rij.... Als het passthrupredicaat false oplevert, gaat de join normaal verder