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.