ATUR ARITHABORT (SQL bertransaksi)

Berlaku untuk:yes SQL Server (semua versi yang didukung) YesAzure SQL Database YesAzure SQL Managed Instance yesAzure Synapse Analytics Analytics yesPlatform System (PDW)

Mengakhiri kueri saat terjadi kesalahan luapan atau bagi-demi-nol selama eksekusi kueri.

Topic link iconKonvensi Sintaksis T-SQL

Sintaks

Sintaks untuk kumpulan SQL SQL Server dan tanpa server di Azure Synapse Analytics

SET ARITHABORT { ON | OFF }

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

SET ARITHABORT ON

Catatan

Untuk melihat sintaks transact-SQL untuk SQL Server 2014 dan yang lebih lama, lihat Dokumentasi versi sebelumnya.

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 ARITHABORT default untuk SQL Server Management Studio 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 cocok dengan pengaturan ARITHABORT klien.

Saat 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 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 kesalahan aritmatika, luapan, bagi-demi-nol, atau domain, SQL Server menyisipkan atau memperbarui nilai NULL. 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 kesalahan pembatalan terjadi 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 PERNYATAAN SET ARITHABORT NONAKTIF, BUAT, PERBARUI, SISIPKAN, dan HAPUS 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.

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  

Lihat juga

Pernyataan SET (Transact-SQL)
ATUR ARITHIGNORE (SQL transact)
SESSIONPROPERTY (SQL Transact)