sql >> Database >  >> RDS >> Sqlserver

Is MS-SQL EN/OF voorwaardelijk (kortsluitingsevaluatie uitvoeren)?

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



  1. psql - sla de resultaten van de opdracht op in een bestand

  2. Het belang van een goed databaseontwerp (en 7 stappen om dit te bereiken)

  3. Een array doorgeven aan een opgeslagen procedure van SQL Server

  4. TIMEFROMPARTS() Voorbeelden in SQL Server (T-SQL)