2012-06-27 37 views
16

Tôi muốn tham khảo SQL Server HOẶC ngắn mạchHOẶC điều hành ngắn mạch trong SQL Server

Code:

DECLARE @tempTable table 
     (
     id int 
    ) 
     INSERT @tempTable(id) values(1) 

     DECLARE @id varchar(10) 
     SET @id = 'x' 
     SELECT * FROM @tempTable WHERE 1=1 OR id = @id --successfully 
     SELECT * FROM @tempTable WHERE @id = 'x' OR id = @id --Exception not Convert 'x' to int 

Tại sao? 1 = 1 và @ id = 'x' là đúng.

SQL Server toán tử OR: xem chức năng ngắn mạch

THANKS

+5

có ** có gì đảm bảo ** nào về cách thức và phần nào của một 'tình trạng OR' được đánh giá đầu tiên (hoặc một cao). T-SQL là ** KHÔNG ** như C# theo cách đó. Bạn ** không thể ** dựa vào mạch ngắn boolean. –

+0

'Tại sao? 1 = 1 và @ id = 'x' là true' - nó là ** hoặc ** thực sự, chứ không phải ** và **. –

+0

Ở đây, trong giá trị INSERT @tempTable (id) (1), INTO bị thiếu. – vijay

Trả lời

14

Trong SQL, có không có yêu cầu rằng một khoản HOẶC phá vỡ sớm. Nói cách khác, nó là tối ưu hóa cho dù để kiểm tra cả hai điều kiện một cách simutaneously. Tôi không phải là một chuyên gia trong trình tối ưu hóa MSSQL, nhưng tôi đã thấy các trường hợp mà trình tối ưu hóa có và không có thông tin ngắn về một mệnh đề OR.

+0

HOẶC ngắn mạch là nghi ngờ của tôi nhưng sql mã văn phòng của tôi là ((@ id là NULL OR id = id) AND (@name IS NULL OR name = @ name)) Tôi muốn biết liệu ngắn mạch Bởi vì quá trình này quyết định hiệu quả Để làm như vậy, chỉ cần sử dụng lại kế hoạch truy vấn – NotTwoWayStreet

5

Chỉ cần stumbled trên câu hỏi này, và đã thấy điều này trên blog-entry: http://rusanu.com/2009/09/13/on-sql-server-boolean-operator-short-circuit/

Các máy chủ SQL là miễn phí để tối ưu hóa một truy vấn bất cứ nơi nào nó thấy phù hợp, vì vậy trong ví dụ được đưa ra trong bài viết trên blog, bạn không thể dựa vào đoản mạch.

Tuy nhiên, CASE rõ ràng là tài liệu được đánh giá theo thứ tự chữ viết - hãy kiểm tra các nhận xét của bài đăng trên blog đó.

-1

Đó là nhưng rõ ràng rằng MS Sql server hỗ trợ lý thuyết ngắn mạch, cải thiện hiệu suất bằng cách tránh kiểm tra không cần thiết,

Hỗ trợ Ví dụ:

SELECT 'TEST' 
WHERE 1 = 'A' 

SELECT 'TEST' 
WHERE 1 = 1 OR 1 = 'A' 

Ở đây, ví dụ đầu tiên sẽ cho kết quả vào lỗi ' Chuyển đổi không thành công khi chuyển đổi giá trị varchar 'A' thành kiểu dữ liệu int. '

Trong khi thứ hai chạy dễ dàng như điều kiện 1 = 1 được đánh giá là TRUE và do đó điều kiện thứ hai không chạy chút nào.

Hơn nữa

SELECT 'TEST' 
WHERE 1 = 0 OR 1 = 'A' 

đây điều kiện đầu tiên sẽ đánh giá false và do đó các DBMS sẽ đi cho điều kiện thứ hai và một lần nữa bạn sẽ nhận được lỗi chuyển đổi như trong ví dụ trên.

Chú ý: Tôi đã viết sai lầm ĐIỀU KIỆN JUST THỰC HIỆN THỜI TIẾT CÁC ĐIỀU KIỆN ĐƯỢC THỰC HIỆN hoặc bị ngắn mạch NẾU kết quả truy vấn LỖI nghĩa là ĐIỀU KIỆN THỰC HIỆN, ngắn mạch KHÁC.

giải thích đơn giản

xem xét,

WHERE 1 = 1 OR 2 = 2 

như điều kiện đầu tiên là nhận được đánh giá để TRUE, nó vô nghĩa để đánh giá điều kiện thứ hai vì đánh giá của mình trong bất kỳ giá trị sẽ không ảnh hưởng đến kết quả ở tất cả, do đó, cơ hội tốt cho Sql Server để tiết kiệm thời gian thực hiện truy vấn bằng cách bỏ qua kiểm tra tình trạng không cần thiết hoặc đánh giá.

trong trường hợp "OR" nếu điều kiện đầu tiên được đánh giá để TRUE toàn bộ chuỗi nối với nhau bằng "OR" sẽ coi như đánh giá là true mà không đánh giá người khác.

condition1 OR condition2 OR ..... OR conditionN 

nếu điều kiện 1 được đánh giá là đúng, hãy bỏ qua tất cả các điều kiện cho đến khi điều kiệnN bị bỏ qua. Nói cách tổng quát khi xác định TRUE TRUE đầu tiên, tất cả các điều kiện khác được liên kết bởi OR sẽ bị bỏ qua.

Hãy xem xét điều kiện thứ hai

WHERE 1 = 0 AND 1 = 1 

như điều kiện đầu tiên là nhận evalutated để FALSE nó vô nghĩa để đánh giá điều kiện thứ hai vì đánh giá của mình trong bất kỳ giá trị sẽ không ảnh hưởng đến kết quả nào cả, vì vậy một lần nữa cơ hội tốt cho Sql Server để tiết kiệm thời gian truy vấn thực thi bằng cách bỏ qua kiểm tra hoặc đánh giá tình trạng không cần thiết.

trong trường hợp "VÀ" nếu điều kiện đầu tiên được đánh giá để FALSE toàn bộ chuỗi kết nối với "VÀ" sẽ được coi là đánh giá để FALSE mà không đánh giá người khác.

condition1 AND condition2 AND ..... conditionN 

nếu condition1 được đánh giá để FALSE, nghỉ ngơi tất cả các điều kiện đến conditionN sẽ được bỏ qua. Nói cách tổng quát khi xác định FALSE, tất cả các điều kiện khác được liên kết bởi AND sẽ bị bỏ qua.

do, một lập trình viên WISE NÊN LUÔN Chương trình CHUỖI ĐIỀU KIỆN TRÊN ĐÓ một cách mà, đắt tiền ÍT HAY NHẤT PHẢI LOẠI BỎ ĐIỀU KIỆN được thực thi FIRST, hoặc sắp xếp ĐIỀU KIỆN trong một cách mà có thể mất lợi ích tối đa ngắn mạch

Cảm ơn và Kính trọng,

Rk_Hirpara

+3

Lý do downvote: luôn kiểm tra mọi thứ trên một máy chủ thực, với một bộ dữ liệu hợp lý.Ví dụ, hãy thử mệnh đề where thực tế hơn đối với một trường character - trong đó isnumeric (fieldname) = 1 AND convert (decimal, fieldname) <= 0 - bạn sẽ thấy rằng nó bị lỗi chuyển đổi trên các hàng có isnumeric = 0, mặc dù về mặt kỹ thuật, không cần đánh giá điều kiện thứ hai trên các hàng như vậy. – Jasmine

Các vấn đề liên quan