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

5 cách để sửa lỗi "Chia cho 0" trong SQL Server (Msg 8134)

Dưới đây là năm tùy chọn để xử lý lỗi Msg 8134 Đã gặp lỗi “Chia cho 0” trong SQL Server.

Lỗi

Đầu tiên, đây là một ví dụ về mã tạo ra lỗi mà chúng ta đang đề cập đến:

SELECT 1 / 0;

Kết quả:

Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.

Chúng tôi gặp lỗi vì chúng tôi đang cố gắng chia một số cho không. Về mặt toán học, điều này không có ý nghĩa gì. Bạn không thể chia một số cho 0 và mong đợi một kết quả có ý nghĩa.

Để đối phó với lỗi này, chúng ta cần quyết định những gì sẽ được trả lại khi chúng ta cố gắng chia cho không. Ví dụ, chúng ta có thể muốn trả về giá trị null. Hoặc chúng tôi có thể muốn số không được trả lại. Hoặc một số giá trị khác.

Dưới đây là một số tùy chọn để xử lý lỗi này.

Tùy chọn 1:NULLIF() Biểu thức

Một cách nhanh chóng và dễ dàng để giải quyết lỗi này là sử dụng NULLIF() biểu thức:

SELECT 1 / NULLIF( 0, 0 );

Kết quả:

NULL

NULLIF() trả về NULL nếu hai biểu thức được chỉ định có cùng giá trị. Nó trả về biểu thức đầu tiên nếu hai biểu thức khác nhau. Do đó, nếu chúng ta sử dụng số 0 làm biểu thức thứ hai, chúng ta sẽ nhận được giá trị null bất cứ khi nào biểu thức đầu tiên bằng 0. Chia một số cho NULL kết quả là NULL .

Trên thực tế, SQL Server đã trả về NULL về lỗi chia cho không, nhưng trong hầu hết các trường hợp, chúng tôi không thấy điều này, do ARITHABORT của chúng tôi và ANSI_WARNINGS cài đặt (thêm về điều này sau).

Tùy chọn 2:Thêm ISNULL() Chức năng

Trong một số trường hợp, bạn có thể muốn trả về giá trị khác với NULL .

Trong những trường hợp như vậy, bạn có thể chuyển ví dụ trước đó vào ISNULL() chức năng:

SELECT ISNULL(1 / NULLIF( 0, 0 ), 0);

Kết quả:

0

Ở đây tôi đã chỉ định rằng số 0 sẽ được trả về bất cứ khi nào kết quả là NULL .

Hãy cẩn thận mặc dù. Trong một số trường hợp, trả về số 0 có thể không phù hợp. Ví dụ:nếu bạn đang xử lý nguồn cung cấp hàng tồn kho, việc chỉ định số 0 có thể ngụ ý rằng không có sản phẩm nào, điều này có thể không đúng.

Tùy chọn 3:Sử dụng CASE Tuyên bố

Một cách khác để làm điều đó là sử dụng CASE tuyên bố:

DECLARE @n1 INT = 20;
DECLARE @n2 INT = 0;

SELECT CASE
    WHEN @n2 = 0
    THEN NULL
    ELSE @n1 / @n2
END

Kết quả:

NULL

Tùy chọn 4:SET ARITHABORT Tuyên bố

SET ARITHABORT câu lệnh kết thúc truy vấn khi xảy ra lỗi tràn hoặc lỗi chia cho không trong khi thực hiện truy vấn. Chúng tôi có thể sử dụng nó cùng với SET ANSI WARNINGS để trả về NULL bất cứ khi nào lỗi chia cho không có thể xảy ra:

SET ARITHABORT OFF;
SET ANSI_WARNINGS OFF;
SELECT 20 / 0;

Kết quả:

NULL

Microsoft khuyến nghị bạn luôn đặt ARITHABORT thành ON trong các phiên đăng nhập của bạn và cài đặt thành OFF có thể tác động tiêu cực đến việc tối ưu hóa truy vấn, dẫn đến các vấn đề về hiệu suất.

Một số ứng dụng khách (chẳng hạn như SQL Server Management Studio) set ARITHABORT thành ON theo mặc định. Đây là lý do tại sao bạn có thể không thấy NULL giá trị được trả về khi bạn chia cho 0. Bạn có thể sử dụng SET ARITHIGNORE để thay đổi hành vi này nếu bạn muốn.

Tùy chọn 5:SET ARITHIGNORE Tuyên bố

SET ARITHIGNORE câu lệnh kiểm soát xem thông báo lỗi được trả về từ lỗi tràn hoặc lỗi chia cho không trong một truy vấn:

SET ARITHABORT OFF;
SET ANSI_WARNINGS OFF;

SET ARITHIGNORE ON;
SELECT 1 / 0 AS Result_1;

SET ARITHIGNORE OFF;
SELECT 1 / 0 AS Result_2;

Kết quả:

Các lệnh
Commands completed successfully.
Commands completed successfully.
Commands completed successfully.
+------------+
| Result_1   |
|------------|
| NULL       |
+------------+
(1 row affected)
Commands completed successfully.
+------------+
| Result_2   |
|------------|
| NULL       |
+------------+
Division by zero occurred.

Ở đây, tôi đặt ARITHABORTANSI_WARNINGS thành OFF để câu lệnh không bị hủy bỏ do lỗi và NULL được trả về bất cứ khi nào có lỗi chia cho không.

Lưu ý rằng SET ARITHIGNORE cài đặt chỉ kiểm soát xem thông báo lỗi có được trả lại hay không. SQL Server trả về một NULL trong một phép tính liên quan đến lỗi tràn hoặc lỗi chia cho không, bất kể cài đặt này là gì.

Trong ví dụ trên, chúng ta có thể thấy rằng khi ARITHIGNORE ON , lỗi chia cho 0 không được trả về. Khi nó OFF , thông báo lỗi chia cho 0 được trả về.


  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ách xác định lại các cột được trả về bởi một thủ tục được lưu trữ trong SQL Server

  2. Cách đặt giá trị mặc định cho cột hiện có

  3. JSON_QUERY () so với JSON_VALUE () trong SQL Server:Sự khác biệt là gì?

  4. Cách tốt nhất để kiểm tra kết nối SQL Server theo chương trình là gì?

  5. Cách di chuyển tệp dữ liệu trong SQL Server - Phần 1