SET ANSI_WARNINGS (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)Titik akhir analitik SQL di Microsoft FabricWarehouse di Microsoft Fabric

Menentukan perilaku standar ISO untuk beberapa kondisi kesalahan.

Konvensi sintaks transact-SQL

Sintaks

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

SET ANSI_WARNINGS { ON | OFF }

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

SET ANSI_WARNINGS ON

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

Keterangan

SET ANSI_WARNINGS memengaruhi kondisi berikut:

  • Saat diatur ke ON, jika nilai null muncul dalam fungsi agregat, seperti SUM, AVG, MAX, MIN, STDEV, STDEVP, VAR, VARP, atau COUNT, pesan peringatan dihasilkan. Saat diatur ke NONAKTIF, tidak ada peringatan yang dikeluarkan.

  • Ketika diatur ke AKTIF, kesalahan overflow divide-by-zero dan aritmatika menyebabkan pernyataan digulung balik dan pesan kesalahan dihasilkan. Saat diatur ke NONAKTIF, kesalahan membagi berdasarkan nol dan luapan aritmatika menyebabkan nilai null dikembalikan. Perilaku di mana kesalahan overflow divide-by-zero atau aritmatika menyebabkan nilai null dikembalikan terjadi jika INSERT atau UPDATE dicoba pada karakter, Unicode, atau kolom biner di mana panjang nilai baru melebihi ukuran maksimum kolom. Jika SET ANSI_WARNINGS AKTIF, INSERT atau UPDATE dibatalkan seperti yang ditentukan oleh standar ISO. Kosong berikutnya diabaikan untuk kolom karakter dan null berikutnya diabaikan untuk kolom biner. Saat NONAKTIF, data dipotong ke ukuran kolom dan pernyataan berhasil.

Catatan

Ketika pemotongan terjadi dalam konversi apa pun ke atau dari data biner atau varbinary , tidak ada peringatan atau kesalahan yang dikeluarkan, terlepas dari opsi SET.

Catatan

ANSI_WARNINGS tidak dihormati saat meneruskan parameter dalam prosedur tersimpan, fungsi yang ditentukan pengguna, atau saat mendeklarasikan dan mengatur variabel dalam pernyataan batch. Misalnya, jika variabel didefinisikan sebagai karakter(3), lalu diatur ke nilai yang lebih besar dari tiga karakter, data dipotong ke ukuran yang ditentukan dan pernyataan INSERT atau UPDATE berhasil.

Anda dapat menggunakan opsi sp_configure opsi pengguna untuk mengatur pengaturan default untuk ANSI_WARNINGS untuk semua koneksi ke server. Untuk informasi selengkapnya, lihat sp_configure (Transact-SQL).

ANSI_WARNINGS harus AKTIF saat Anda membuat atau memanipulasi indeks pada kolom komputasi atau tampilan terindeks. Jika SET ANSI_WARNINGS NONAKTIF, PERNYATAAN CREATE, UPDATE, INSERT, dan DELETE pada tabel dengan indeks pada kolom komputasi atau tampilan terindeks akan gagal. Untuk informasi selengkapnya tentang pengaturan opsi SET yang diperlukan dengan tampilan dan indeks terindeks pada kolom komputasi, lihat "Pertimbangan Saat Anda Menggunakan Pernyataan SET" dalam Pernyataan SET (Transact-SQL).

SQL Server menyertakan opsi database ANSI_WARNINGS. Ini setara dengan SET ANSI_WARNINGS. Ketika SET ANSI_WARNINGS AKTIF, kesalahan atau peringatan dimunculkan dalam dibagi berdasarkan nol, string terlalu besar untuk kolom database, dan kesalahan serupa lainnya. Ketika SET ANSI_WARNINGS NONAKTIF, kesalahan dan peringatan ini tidak dimunculkan. Nilai default dalam model database untuk SET ANSI_WARNINGS NONAKTIF. Jika tidak ditentukan, pengaturan ANSI_WARNINGS berlaku. Jika SET ANSI_WARNINGS NONAKTIF, SQL Server menggunakan nilai kolom is_ansi_warnings_on dalam tampilan katalog sys.databases .

Penting

ANSI_WARNINGS harus diatur ke AKTIF untuk menjalankan kueri terdistribusi.

Klien, seperti driver ODBC Klien Asli SQL Server, Penyedia OLE DB Klien Asli SQL Server untuk SQL Server, dan Driver Microsoft JDBC untuk SQL Server secara otomatis mengatur ANSI_WARNINGS ke AKTIF dengan bendera koneksi. Ini dapat dikonfigurasi di sumber data ODBC, dalam atribut koneksi ODBC, diatur dalam aplikasi sebelum menyambungkan. Default untuk SET ANSI_WARNINGS NONAKTIF untuk koneksi dari aplikasi DB-Library. Untuk informasi tambahan, lihat LOGIN7 dalam spesifikasi protokol Aliran Data Tabular (TDS).

Saat ANSI_DEFAULTS AKTIF, ANSI_WARNINGS diaktifkan.

Pengaturan ANSI_WARNINGS didefinisikan pada waktu eksekusi atau run time dan bukan pada waktu penguraian. Seperti semua Pernyataan SET, SET ANSI_WARNINGS memengaruhi sesi saat ini.

Jika 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.

Untuk menampilkan pengaturan saat ini untuk pengaturan ini, jalankan kueri berikut.

DECLARE @ANSI_WARN VARCHAR(3) = 'OFF';  
IF ( (8 & @@OPTIONS) = 8 ) SET @ANSI_WARN = 'ON';  
SELECT @ANSI_WARN AS ANSI_WARNINGS;  

Izin

Memerlukan keanggotaan dalam peran publik .

Contoh

Contoh berikut menunjukkan tiga situasi yang sebelumnya disebutkan, dengan SET ANSI_WARNINGS ke AKTIF dan NONAKTIF.

CREATE TABLE T1   
(  
   a int,   
   b int NULL,   
   c varchar(20)  
);  
GO  
  
SET NOCOUNT ON;  
  
INSERT INTO T1   
VALUES (1, NULL, '')   
      ,(1, 0, '')  
      ,(2, 1, '')  
      ,(2, 2, '');  
  
SET NOCOUNT OFF;  
GO  

Sekarang atur ANSI_WARNINGS ke AKTIF dan uji.

PRINT '**** Setting ANSI_WARNINGS ON';  
GO  
  
SET ANSI_WARNINGS ON;  
GO  
  
PRINT 'Testing NULL in aggregate';  
GO  
SELECT a, SUM(b)   
FROM T1   
GROUP BY a;  
GO  
  
PRINT 'Testing String Overflow in INSERT';  
GO  
INSERT INTO T1   
VALUES (3, 3, 'Text string longer than 20 characters');  
GO  
  
PRINT 'Testing Divide by zero';  
GO  
SELECT a / b AS ab   
FROM T1;  
GO  

Sekarang atur ANSI_WARNINGS ke NONAKTIF dan uji.

PRINT '**** Setting ANSI_WARNINGS OFF';  
GO  
SET ANSI_WARNINGS OFF;  
GO  
  
PRINT 'Testing NULL in aggregate';  
GO  
SELECT a, SUM(b)   
FROM T1   
GROUP BY a;  
GO  
  
PRINT 'Testing String Overflow in INSERT';  
GO  
INSERT INTO T1   
VALUES (4, 4, 'Text string longer than 20 characters');  
GO  
SELECT a, b, c   
FROM T1  
WHERE a = 4;  
GO  
  
PRINT 'Testing Divide by zero';  
GO  
SELECT a / b AS ab   
FROM T1;  
GO  
  
DROP TABLE T1;