SET SET ARITHABORT (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistem Platform Analitik (PDW)Titik akhir analitik SQL di Microsoft FabricGudang di Microsoft FabricDatabase SQL 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 dalam sesi masuk Anda. Pengaturan ARITHABORT ke NONAKTIF dapat berdampak negatif pada pengoptimalan kueri, yang menyebabkan masalah performa.

Peringatan

Pengaturan default ARITHABORT untuk SQL Server Management Studio adalah AKTIF. Pengaturan ARITHABORT aplikasi klien 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 setelan klien ARITHABORT .

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

Saat SET ARITHABORT ON dan SET ANSI WARNINGS OFF, kondisi kesalahan ini menyebabkan batch berakhir. Jika kesalahan terjadi dalam transaksi, transaksi akan digulung balik. Ketika SETSET ARITHABORT OFF dan salah satu kesalahan ini terjadi, pesan peringatan muncul dan hasil operasi aritmatika adalah NULL.

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

Catatan

Jika tidak SET ARITHABORT aktif atau SETSET ARITHIGNORE tidak aktif, SQL Server kembali NULL dan pesan peringatan muncul setelah kueri berjalan.

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

Untuk evaluasi ekspresi, jika SET ARITHABORT OFF dan INSERTpernyataan , UPDATE, atau DELETE menemukan kesalahan 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.

Saat salah satu SET ARITHABORT atau SETSET ARITHIGNORE MATI dan SETSET ANSI_WARNINGS AKTIF, SQL Server masih mengembalikan pesan kesalahan saat mengalami kesalahan divide-by-zero atau overflow.

Ketika SETSET ARITHABORT OFF dan kesalahan pembatalan terjadi selama evaluasi kondisi Boolean dari pernyataan IF, cabang FALSE dieksekusi.

SET SET ARITHABORT harus AKTIF saat Anda membuat atau mengubah indeks pada kolom komputasi atau tampilan yang diindeks. Jika SET ARITHABORT OFF, CREATE, UPDATE, , INSERTdan DELETE pernyataan pada tabel dengan indeks pada kolom yang dihitung atau tampilan yang diindeks gagal.

Pengaturan terjadi SETSET ARITHABORT pada waktu eksekusi atau eksekusi dan bukan pada waktu penguraian.

SET SET ARITHABORTOFF tidak didukung di kumpulan SQL khusus Azure Synapse Analytics.

Untuk melihat pengaturan saat ini untuk SETSET 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