Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Czy MS-SQL AND/OR jest warunkowy (wykonywanie oceny zwarcia)?

Nie ma gwarancji takiego zachowania.

Przykład oceny zwarcia nie dzieje się z expr1 AND expr2 jest

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) jest false (co oznacza And -ed wyrażenie musi być False ), ale wyniki IO pokazują, że drugi warunek był nadal oceniany.

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 może zrób to jednak. Widzę to w moim teście

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'

Wyjście to

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)

Wyświetlam spt_values nigdy nie uzyskano dostępu.

Jest to realizowane przez warunek predykatu przejścia w planie wykonania. Kilka informacji na ich temat znajduje się tutaj.

Jeśli predykat passthru ma wartość true, złączenie zwraca wiersz.... Jeśli passthrupredicate ma wartość false, łączenie przebiega normalnie



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Problem z tabelą tymczasową RODBC podczas łączenia się z MS SQL Server

  2. SQL Server 2005 Używanie DateAdd do dodawania dnia do daty

  3. Kiedy używać EXCEPT w przeciwieństwie do NOT EXISTS w Transact SQL?

  4. Jak formatować liczby przecinkami w SQL Server

  5. Znaki ucieczki w wyszukiwaniu pełnotekstowym programu SQL Server?