Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Sistem Platform Analitik (PDW)
Titik akhir analitik SQL di Microsoft Fabric
Gudang di Microsoft Fabric
Database SQL di Microsoft Fabric
Pengaturan menentukan SET ARITHABORT apakah kueri berhenti saat terjadi kesalahan overflow atau divide-by-zero selama eksekusi kueri.
Saat Anda mengatur
SET ARITHABORT ONdanSET ANSI_WARNINGS OFF, kesalahan aritmatika menyebabkan batch berakhir. Jika kesalahan terjadi dalam transaksi, transaksi akan digulung balik.Jika keduanya
SET ARITHABORTdanSET ANSI_WARNINGSareOFFdan kesalahan aritmatika terjadi, pesan peringatan muncul (kecualiSET ARITHIGNOREadalahON) dan hasil operasi aritmatika adalahNULL.
Sintaks
Sintaks untuk SQL Server, kumpulan SQL tanpa server di Azure Synapse Analytics, Microsoft Fabric, database SQL di Microsoft Fabric
SET ARITHABORT { ON | OFF }
Sintaks untuk Azure Synapse Analytics dan Analytics Platform System (PDW)
SET ARITHABORT ON
Keterangan
Ketika ANSI_WARNINGS ( ON default), pengaturan tidak ARITHABORT memiliki efek fungsional. Kesalahan aritmatika menyebabkan kueri berakhir, tetapi batch tidak dibatalkan (selama pengaturannya XACT_ABORT adalah OFF). Kesalahan aritmatika meliputi overflow, divide-by-zero, atau kesalahan domain.
Peringatan
Pengaturan default ARITHABORT untuk SQL Server Management Studio (SSMS) adalah ON, sedangkan koneksi klien dalam aplikasi default ke ARITHABORT OFF. Bahkan jika tidak ada perbedaan fungsional selama ANSI_WARNINGS , ONpengaturannya ARITHABORT masih merupakan kunci cache. Oleh karena itu, SSMS dan aplikasi sama-sama menggunakan defaultnya masing-masing, memiliki entri cache yang berbeda, dan mungkin mendapatkan rencana kueri yang berbeda, sehingga sulit untuk memecahkan masalah kueri yang berkinerja buruk. Artinya, kueri yang sama mungkin dijalankan lebih lambat di aplikasi daripada di SSMS. Saat memecahkan masalah kueri dengan Management Studio, selalu cocokkan setelan klien ARITHABORT .
Untuk evaluasi ekspresi, jika baik SET ANSI_WARNINGS dan SET ARITHABORT are OFF maupun INSERT, UPDATE, atau DELETE pernyataan menemukan kesalahan aritmatika, kueri akan menyisipkan atau memperbarui NULL nilai. Jika kolom target tidak dapat diubah ke null, tindakan sisipkan atau perbarui gagal dan pengguna melihat kesalahan.
Pengaturan terjadi SET ARITHABORT pada waktu eksekusi atau eksekusi dan bukan pada waktu penguraian.
SET ARITHABORT OFFtidak didukung di kumpulan SQL khusus Azure Synapse Analytics.
Izin
Memerlukan keanggotaan dalam peran publik .
Lihat pengaturan saat ini ARITHABORT
Untuk melihat pengaturan saat ini untuk SET ARITHABORT, jalankan kueri T-SQL berikut:
DECLARE @ARITHABORT VARCHAR(3) = 'OFF';
IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = 'ON';
SELECT @ARITHABORT AS ARITHABORT;
Contoh
Contoh berikut menunjukkan kesalahan divide-by-zero dan overflow dengan pengaturan yang berbeda SET ARITHABORT .
- Skrip membuat tabel
t1sampel dant2menyisipkan nilai data sampel. - Atur
ANSI_WARNINGS ONdan jalankan pengujian untuk melihat perilaku default kesalahan bagi dengan nol dan luapan aritmatika. - Atur
ANSI_WARNINGS OFFsehingga berpengaruhARITHABORT, dan aturARITHABORT ON. Jalankan pengujian untuk melihat perilaku dengan kesalahan divide-by-zero dan arithmetic overflow. - Atur keduanya
ANSI_WARNINGS OFFdanARITHABORT OFF. Jalankan pengujian untuk melihat perilaku dengan kesalahan divide-by-zero dan arithmetic overflow. - Bersihkan tabel sampel.
-- SET ARITHABORT
-------------------------------------------------------------------------------
-- Create tables t1 and t2 and insert data values.
CREATE TABLE t1 (
a TINYINT,
b TINYINT
);
CREATE TABLE t2 (
a TINYINT NOT NULL
);
GO
INSERT INTO t1
VALUES (1, 0);
INSERT INTO t1
VALUES (255, 1);
GO
-- First run with ANSI_WARNINGS ON to see the default behavior.
PRINT '*** SET ANSI_WARNINGS ON';
SET ANSI_WARNINGS ON;
SET XACT_ABORT OFF; -- To make sure that we have the default setting for this option.
GO
PRINT '*** Testing divide-by-zero during SELECT';
GO
SELECT a / b AS ab
FROM t1;
PRINT 'This prints, despite the error message.';
GO
PRINT '*** Testing divide-by-zero during INSERT';
GO
INSERT INTO t2
SELECT a / b AS ab
FROM t1;
PRINT 'This prints, despite the error message.';
GO
PRINT '*** Testing tinyint overflow';
GO
INSERT INTO t2
SELECT a + b AS ab
FROM t1;
PRINT 'This prints, despite the error message.';
GO
PRINT '*** Resulting data - should be no data';
GO
SELECT *
FROM t2;
GO
-- Truncate table t2.
TRUNCATE TABLE t2;
GO
-- Set ANSI_WARNINGS OFF so that ARITHABORT has effect, and set ARITHABORT ON.
PRINT '*** SET ANSI_WARNINGS OFF; SET ARITHABORT ON';
GO
SET ANSI_WARNINGS OFF;
SET ARITHABORT ON;
GO
PRINT '*** Testing divide-by-zero during SELECT';
GO
SELECT a / b AS ab
FROM t1;
PRINT 'This does not print.';
GO
PRINT '*** Testing divide-by-zero during INSERT';
GO
INSERT INTO t2
SELECT a / b AS ab
FROM t1;
PRINT 'This does not print.';
GO
PRINT '*** Testing tinyint overflow';
GO
INSERT INTO t2
SELECT a + b AS ab
FROM t1;
PRINT 'This does not print.';
GO
PRINT '*** Resulting data - should be 0 rows';
GO
SELECT *
FROM t2;
GO
-- Truncate table t2.
TRUNCATE TABLE t2;
GO
-- Set both ANSI_WARNINGS OFF and ARITHABORT OFF.
PRINT '*** SET ARITHABORT OFF';
GO
SET ARITHABORT OFF;
GO
PRINT '*** Testing divide-by-zero during SELECT';
GO
-- Returns NULL.
SELECT a / b AS ab
FROM t1;
GO
PRINT '*** Testing divide-by-zero during INSERT';
GO
-- Fails with NOT NULL violation.
INSERT INTO t2
SELECT a / b AS ab
FROM t1;
GO
PRINT '*** Testing tinyint overflow';
GO
-- Fails with NOT NULL violation
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 and restore ANSI_WARNINGS
DROP TABLE t1;
DROP TABLE t2;
SET ANSI_WARNINGS ON
GO