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.