Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

5 Cara Memperbaiki “Divide by zero error” di SQL Server (Msg 8134)

Berikut adalah lima opsi untuk menangani kesalahan Msg 8134 “Bagi dengan nol kesalahan yang ditemui” di SQL Server.

Kesalahan

Pertama, berikut adalah contoh kode yang menghasilkan kesalahan yang sedang kita bicarakan:

SELECT 1 / 0;

Hasil:

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

Kami mendapatkan kesalahan karena kami mencoba membagi angka dengan nol. Secara matematis, ini tidak masuk akal. Anda tidak dapat membagi angka dengan nol dan mengharapkan hasil yang berarti.

Untuk mengatasi kesalahan ini, kita perlu memutuskan apa yang harus dikembalikan ketika kita mencoba membagi dengan nol. Misalnya, kita mungkin ingin nilai null dikembalikan. Atau kita mungkin ingin nol dikembalikan. Atau nilai lainnya.

Berikut adalah beberapa opsi untuk mengatasi kesalahan ini.

Opsi 1:NULLIF() Ekspresi

Cara cepat dan mudah untuk mengatasi kesalahan ini adalah dengan menggunakan NULLIF() ekspresi:

SELECT 1 / NULLIF( 0, 0 );

Hasil:

NULL

NULLIF() mengembalikan NULL jika dua ekspresi yang ditentukan adalah nilai yang sama. Ini mengembalikan ekspresi pertama jika dua ekspresi berbeda. Oleh karena itu, jika kita menggunakan nol sebagai ekspresi kedua, kita akan mendapatkan nilai nol setiap kali ekspresi pertama adalah nol. Membagi angka dengan NULL menghasilkan NULL .

Sebenarnya, SQL Server sudah mengembalikan NULL pada kesalahan bagi-dengan-nol, tetapi dalam banyak kasus kami tidak melihat ini, karena ARITHABORT kami dan ANSI_WARNINGS pengaturan (lebih lanjut tentang ini nanti).

Opsi 2:Tambahkan ISNULL() Fungsi

Dalam beberapa kasus, Anda mungkin lebih suka mengembalikan nilai selain NULL .

Dalam kasus seperti itu, Anda dapat meneruskan contoh sebelumnya ke ISNULL() fungsi:

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

Hasil:

0

Di sini saya menetapkan bahwa nol harus dikembalikan setiap kali hasilnya NULL .

Hati-hati sekalipun. Dalam beberapa kasus, mengembalikan nol mungkin tidak tepat. Misalnya, jika Anda berurusan dengan persediaan inventaris, menentukan nol mungkin menyiratkan bahwa tidak ada produk, yang mungkin tidak terjadi.

Opsi 3:Gunakan CASE Pernyataan

Cara lain untuk melakukannya adalah dengan menggunakan CASE pernyataan:

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

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

Hasil:

NULL

Opsi 4:SET ARITHABORT Pernyataan

SET ARITHABORT pernyataan mengakhiri kueri saat terjadi kesalahan overflow atau bagi-oleh-nol selama eksekusi kueri. Kita dapat menggunakannya bersama dengan SET ANSI WARNINGS untuk mengembalikan NULL kapan pun kesalahan bagi-dengan-nol mungkin terjadi:

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

Hasil:

NULL

Microsoft menyarankan Anda untuk selalu menyetel ARITHABORT ke ON di sesi masuk Anda, dan menyetelnya ke OFF dapat berdampak negatif pada pengoptimalan kueri, yang menyebabkan masalah performa.

Beberapa klien (seperti SQL Server Management Studio) set ARITHABORT ke ON secara default. Inilah mengapa Anda mungkin tidak melihat NULL nilai yang dikembalikan ketika Anda membagi dengan nol. Anda dapat menggunakan SET ARITHIGNORE untuk mengubah perilaku ini jika Anda mau.

Opsi 5:SET ARITHIGNORE Pernyataan

SET ARITHIGNORE pernyataan mengontrol apakah pesan kesalahan dikembalikan dari luapan atau kesalahan bagi-dengan-nol selama kueri:

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;

Hasil:

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.

Di sini, saya mengatur ARITHABORT dan ANSI_WARNINGS ke OFF sehingga pernyataan tidak dibatalkan karena kesalahan, dan NULL dikembalikan setiap kali ada kesalahan bagi-dengan-nol.

Perhatikan bahwa SET ARITHIGNORE pengaturan hanya mengontrol apakah pesan kesalahan dikembalikan. SQL Server mengembalikan NULL dalam penghitungan yang melibatkan kesalahan luapan atau pembagian dengan nol, terlepas dari setelan ini.

Pada contoh di atas kita dapat melihat bahwa ketika ARITHIGNORE adalah ON , kesalahan pembagian dengan nol tidak dikembalikan. Saat OFF , pesan kesalahan pembagian dengan nol dikembalikan.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Spotlight Tuning Pack Basic:Alat Pengoptimalan SQL Gratis Terbaik

  2. Memasukkan data objek besar ke Salesforce.com dari SQL Server

  3. Tidak sama dengan <> !=operator pada NULL

  4. SQL Server:Sisi gelap NVARCHAR

  5. Contoh Konversi 'waktu' ke 'waktu waktu' di SQL Server (T-SQL)