Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

MS-SQL có điều kiện AND / OR (thực hiện đánh giá ngắn mạch) không?

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

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)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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cơ sở dữ liệu sao lưu SQL Server Express | Cách lập lịch trình tự động hóa và dọn dẹp sao lưu SQL Express

  2. Giới hạn phiên người dùng đồng thời cho một đăng nhập cụ thể trong SQL Server

  3. Xóa SCHEMABINDING khỏi một hàm do người dùng xác định trong SQL Server

  4. Trả về danh sách các lược đồ phân vùng trong SQL Server (T-SQL)

  5. datetime so với smalldatetime trong SQL Server:Sự khác biệt là gì?