Bagikan melalui


SET ARITHABORT (Transact-SQL)

Berlaku untuk: Titik akhir analitik SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Platform System (PDW) SQL di Microsoft Fabric Warehouse di Microsoft Fabric

Mengakhiri kueri saat terjadi kesalahan luapan atau membagi berdasarkan nol selama eksekusi kueri.

Konvensi sintaks transact-SQL

Sintaks

Sintaks untuk SQL Server, kumpulan SQL tanpa server di Azure Synapse Analytics, Microsoft Fabric

SET ARITHABORT { ON | OFF }

Sintaks untuk Azure Synapse Analytics dan Analytics Platform System (PDW)

SET ARITHABORT ON

Keterangan

Selalu atur ARITHABORT ke AKTIF di sesi masuk Anda. Mengatur ARITHABORT ke NONAKTIF dapat berdampak negatif pada pengoptimalan kueri, yang mengarah ke masalah performa.

Peringatan

Pengaturan default ARITHABORT untuk SQL Server Management Studio adalah AKTIF. Aplikasi klien yang mengatur ARITHABORT ke OFF mungkin menerima rencana kueri yang berbeda, sehingga sulit untuk memecahkan masalah kueri yang berkinerja buruk. Artinya, kueri yang sama mungkin dijalankan dengan cepat di studio manajemen tetapi lambat dalam aplikasi. Saat memecahkan masalah kueri dengan Management Studio, selalu cocokkan pengaturan ARITHABORT klien.

Ketika SET ARITHABORT dan SET ANSI WARNINGS AKTIF, kondisi kesalahan ini menyebabkan kueri berakhir.

Ketika SET ARITHABORT AKTIF dan SET ANSI WARNINGS NONAKTIF, kondisi kesalahan ini menyebabkan batch berakhir. Jika kesalahan terjadi dalam transaksi, transaksi akan digulung balik. Ketika SET ARITHABORT NONAKTIF dan salah satu kesalahan ini terjadi, pesan peringatan muncul dan hasil operasi aritmetika adalah NULL.

Jika SET ARITHABORT dan SET ANSI WARNINGS NONAKTIF dan salah satu kesalahan ini terjadi, pesan peringatan muncul, dan hasil operasi aritmetika adalah NULL.

Catatan

Jika SET ARITHABORT atau SET ARITHIGNORE tidak AKTIF, SQL Server mengembalikan NULL dan pesan peringatan muncul setelah kueri berjalan.

Ketika ANSI_WARNINGS memiliki nilai ON dan tingkat kompatibilitas database diatur ke 90 atau lebih tinggi, ARITHABORT secara implisit ON terlepas dari pengaturan nilainya. Jika tingkat kompatibilitas database diatur ke 80 atau yang lebih lama, opsi ARITHABORT harus diatur secara eksplisit ke AKTIF.

Untuk evaluasi ekspresi, jika SET ARITHABORT NONAKTIF dan pernyataan INSERT, UPDATE, atau DELETE menemukan nilai aritmatika, overflow, divide-by-zero, atau domain, SQL Server menyisipkan atau memperbarui NULL nilai. Jika kolom target tidak dapat diubah ke null, tindakan sisipkan atau perbarui gagal dan pengguna melihat kesalahan.

Ketika SET ARITHABORT atau SET ARITHIGNORE NONAKTIF dan SET ANSI_WARNINGS AKTIF, SQL Server masih mengembalikan pesan kesalahan saat mengalami kesalahan dibagi-demi-nol atau luapan.

Ketika SET ARITHABORT NONAKTIF dan terjadi kesalahan pembatalan selama evaluasi kondisi Boolean dari pernyataan IF, cabang FALSE dijalankan.

SET ARITHABORT harus AKTIF saat Anda membuat atau mengubah indeks pada kolom komputasi atau tampilan terindeks. Jika SET ARITHABORT NONAKTIF, BUAT, PERBARUI, SISIPKAN, dan HAPUS pernyataan pada tabel dengan indeks pada kolom komputasi atau tampilan terindeks gagal.

Pengaturan SET ARITHABORT terjadi pada waktu eksekusi atau run time dan bukan pada waktu penguraian.

SET ARITHABORT OFF tidak didukung di kumpulan SQL khusus Azure Synapse Analytics.

Untuk menampilkan pengaturan saat ini untuk SET ARITHABORT, jalankan kueri berikut:

DECLARE @ARITHABORT VARCHAR(3) = 'OFF';  
IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = 'ON';  
SELECT @ARITHABORT AS ARITHABORT;  

Izin

Memerlukan keanggotaan dalam peran publik .

Contoh

Contoh berikut menunjukkan kesalahan bagi-demi-nol dan luapan yang memiliki SET ARITHABORT pengaturan.

-- SET ARITHABORT  
-------------------------------------------------------------------------------  
-- Create tables t1 and t2 and insert data values.  
CREATE TABLE t1 (  
   a TINYINT,   
   b TINYINT  
);  
CREATE TABLE t2 (  
   a TINYINT  
);  
GO  
INSERT INTO t1   
VALUES (1, 0);  
INSERT INTO t1   
VALUES (255, 1);  
GO  
  
PRINT '*** SET ARITHABORT ON';  
GO  
-- SET ARITHABORT ON and testing.  
SET ARITHABORT ON;  
GO  
  
PRINT '*** Testing divide by zero during SELECT';  
GO  
SELECT a / b AS ab   
FROM t1;  
GO  
  
PRINT '*** Testing divide by zero during INSERT';  
GO  
INSERT INTO t2  
SELECT a / b AS ab    
FROM t1;  
GO  
  
PRINT '*** Testing tinyint overflow';  
GO  
INSERT INTO t2  
SELECT a + b AS ab   
FROM t1;  
GO  
  
PRINT '*** Resulting data - should be no data';  
GO  
SELECT *   
FROM t2;  
GO  
  
-- Truncate table t2.  
TRUNCATE TABLE t2;  
GO  
  
-- SET ARITHABORT OFF and testing.  
PRINT '*** SET ARITHABORT OFF';  
GO  
SET ARITHABORT OFF;  
GO  
  
-- This works properly.  
PRINT '*** Testing divide by zero during SELECT';  
GO  
SELECT a / b AS ab    
FROM t1;  
GO  
  
-- This works as if SET ARITHABORT was ON.  
PRINT '*** Testing divide by zero during INSERT';  
GO  
INSERT INTO t2  
SELECT a / b AS ab    
FROM t1;  
GO  
PRINT '*** Testing tinyint overflow';  
GO  
INSERT INTO t2  
SELECT a + b AS ab   
FROM t1;  
GO  
  
PRINT '*** Resulting data - should be 0 rows';  
GO  
SELECT *   
FROM t2;  
GO  
  
-- Drop tables t1 and t2.  
DROP TABLE t1;  
DROP TABLE t2;  
GO