Di SQL Server, ANSI_NULLS
pengaturan memungkinkan Anda untuk menentukan bagaimana NULL
nilai diperlakukan dalam kueri.
Lebih khusus lagi, ini memungkinkan Anda untuk menentukan perilaku yang sesuai dengan ISO dari Equals (=
) dan Tidak Sama Dengan (<>
) operator perbandingan saat digunakan dengan NULL
nilai.
ANSI_NULLS
dapat diatur ke ON
atau OFF
. Sebuah NULL
tes yang mengembalikan true dengan ANSI_NULLS OFF
mungkin benar-benar mengembalikan false dengan ANSI_NULLS ON
.
Ini bisa menjadi sumber dari banyak kebingungan, sehingga perlu dipahami dengan tepat bagaimana ANSI_NULLS
bekerja.
ANSI_NULLS
pengaturan dapat diatur pada tingkat database dan pada tingkat sesi. Jika ANSI_NULLS
pengaturan pada tingkat sesi tidak ditentukan, SQL Server akan menggunakan ANSI_NULLS
mana saja pengaturan diterapkan ke database saat ini. Oleh karena itu, Anda dapat mengganti pengaturan database dengan pengaturan tingkat sesi Anda sendiri saat menulis kueri ad hoc.
Hal penting yang perlu diperhatikan adalah bahwa driver ODBC SQL Server Native Client dan Penyedia OLE DB SQL Server Native Client untuk SQL Server secara otomatis mengatur ANSI_NULLS
ke ON
saat menghubungkan. Pengaturan ini dapat dikonfigurasi di sumber data ODBC, atribut koneksi ODBC, atau properti koneksi OLE DB yang diatur dalam aplikasi sebelum menyambungkan ke contoh SQL Server.
Cara Memeriksa Setelan ANSI_NULLS Sesi Anda
Anda dapat menggunakan SESSIONPROPERTY()
berfungsi untuk memeriksa ANSI_NULLS
pengaturan untuk sesi saat ini.
SELECT SESSIONPROPERTY('ANSI_NULLS');
Hasil:
+--------------------+ | (No column name) | |--------------------| | 1 | +--------------------+
Dalam hal ini, ANSI_NULLS
pengaturan untuk sesi saya adalah ON
.
Sebuah nol (0
) berarti tidak aktif.
Cara Mengubah Pengaturan ANSI_NULLS Sesi Anda
Anda dapat mengatur pengaturan ANSI_NULLS sesi Anda ke OFF
dengan kode berikut:
SET ANSI_NULLS OFF;
Kemudian memeriksanya lagi akan menghasilkan nol.
SELECT SESSIONPROPERTY('ANSI_NULLS');
Hasil:
+--------------------+ | (No column name) | |--------------------| | 0 | +--------------------+
Nilai default untuk SET ANSI_NULLS
adalah OFF
. Namun, seperti yang disebutkan di atas, pengandar ODBC SQL Server Native Client dan Penyedia OLE DB SQL Server Native Client untuk SQL Server secara otomatis menetapkan ANSI_NULLS
ke ON
saat menghubungkan.
Contoh Cara ANSI_NULLS
Memengaruhi Kueri
Berikut adalah beberapa contoh dasar untuk mendemonstrasikan berbagai hasil yang bisa Anda peroleh, bergantung pada nilai ANSI_NULLS
pengaturan.
Ini menggunakan SET ANSI_NULLS
untuk mengaktifkan ANSI_NULLS
pengaturan untuk sesi saat ini.
ANSI_NULLS ON
SET ANSI_NULLS ON;
SELECT NULL
WHERE NULL = NULL;
Hasil:
(0 rows affected)
Ketika ANSI_NULLS
adalah ON
, semua perbandingan terhadap NULL
nilai mengevaluasi ke UNKNOWN
.
Dalam hal ini, kami tidak dapat mengatakan bahwa NULL
sama dengan NULL
karena setiap nilai tidak diketahui.
Oleh karena itu, tidak ada baris yang dikembalikan untuk kueri di atas.
ANSI_NULLS OFF
SET ANSI_NULLS OFF;
SELECT NULL
WHERE NULL = NULL;
Hasil:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+
Ketika ANSI_NULLS
adalah OFF
, perbandingan semua data terhadap NULL
nilai mengevaluasi ke TRUE
jika nilai datanya NULL
.
Logika yang sama berlaku saat menggunakan operator Not Equal To (<>
).
Mari kita perluas contoh untuk menyertakan operator Not Equal To (<>
), serta perbandingan antara NULL
dan non-NULL
nilai.
ANSI_NULLS ON
SET ANSI_NULLS ON;
SELECT NULL
WHERE NULL = NULL;
SELECT 'Not NULL'
WHERE NULL <> NULL;
SELECT NULL
WHERE 1 = NULL;
SELECT 'Not NULL'
WHERE 1 <> NULL;
Hasil:
(0 rows affected) (0 rows affected) (0 rows affected) (0 rows affected)
Seperti yang diharapkan, tidak ada baris yang dikembalikan untuk kueri apa pun. Ini karena NULL
nilai diperlakukan sebagai UNKNOWN
nilai ketika ANSI_NULLS
adalah ON
.
ANSI_NULLS OFF
SET ANSI_NULLS OFF;
SELECT NULL
WHERE NULL = NULL;
SELECT 'Not NULL'
WHERE NULL <> NULL;
SELECT NULL
WHERE 1 = NULL;
SELECT 'Not NULL'
WHERE 1 <> NULL;
Hasil:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) (0 rows affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected)
Kami mendapatkan hasil yang berbeda ketika ANSI_NULLS
adalah OFF
.
Dalam hal ini, SQL Server tidak memperlakukan NULL
sebagai UNKNOWN
. Ini menentukan bahwa NULL
sebenarnya sama dengan NULL
.
Ini tidak sesuai dengan standar ANSI.
IS NULL
Predikat
Agar skrip berfungsi sebagaimana dimaksud, terlepas dari ANSI_NULLS
opsi basis data atau pengaturan SET ANSI_NULLS
, gunakan IS NULL
dan IS NOT NULL
dalam perbandingan yang mungkin berisi nilai nol
Inilah yang terjadi ketika kita menulis ulang contoh sebelumnya menggunakan IS NULL
dan IS NOT NULL
.
ANSI_NULLS ON
SET ANSI_NULLS ON;
SELECT NULL
WHERE NULL IS NULL;
SELECT NULL
WHERE NULL IS NOT NULL;
SELECT 'Not NULL'
WHERE 1 IS NULL;
SELECT 'Not NULL'
WHERE 1 IS NOT NULL;
Hasil:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) (0 rows affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected)
ANSI_NULLS OFF
SET ANSI_NULLS OFF;
SELECT NULL
WHERE NULL IS NULL;
SELECT NULL
WHERE NULL IS NOT NULL;
SELECT 'Not NULL'
WHERE 1 IS NULL;
SELECT 'Not NULL'
WHERE 1 IS NOT NULL;
Hasil:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) (0 rows affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected)
Seperti yang diharapkan, kami mendapatkan hasil yang sama terlepas dari ANSI_NULLS
pengaturan.
Tabel Perbandingan
Tabel berikut menguraikan variasi yang bisa Anda dapatkan bergantung pada ekspresi Boolean dan ANSI_NULLS
pengaturan.
Ekspresi Boolean | SET ANSI_NULLS AKTIF | MENONAKTIFKAN ANSI_NULLS |
---|---|---|
NULL =NULL | TIDAK DIKETAHUI | BENAR |
1 =NULL | TIDAK DIKETAHUI | SALAH |
NULL <>NULL | TIDAK DIKETAHUI | SALAH |
1 <> NULL | TIDAK DIKETAHUI | BENAR |
NULL> NULL | TIDAK DIKETAHUI | TIDAK DIKETAHUI |
1> NULL | TIDAK DIKETAHUI | TIDAK DIKETAHUI |
NULL ADALAH NULL | BENAR | BENAR |
1 NULL | SALAH | SALAH |
NULL BUKAN NULL | SALAH | SALAH |
1 BUKAN NULL | BENAR | BENAR |
Menyetel ANSI_NULLS di Tingkat Basis Data
Setiap database SQL Server memiliki ANSI_NULLS
pengaturan, yang menentukan bagaimana perbandingan dengan NULL
nilai dievaluasi.
- Bila disetel ke
ON
, perbandingan denganNULL
nilai mengevaluasi keUNKNOWN
. - Bila disetel ke
OFF
, perbandingan nilai non-Unicode denganNULL
nilai mengevaluasi keTRUE
jika kedua nilai adalahNULL
.
Anda dapat mengubah pengaturan ini pada database dengan kode berikut:
ALTER DATABASE CURRENT
SET ANSI_NULLS ON;
Itu menetapkan ANSI_NULLS
ke ON
untuk database saat ini. Anda dapat menukar CURRENT
dengan nama database jika diinginkan.
Anda dapat memeriksa pengaturan saat ini dengan DATABASEPROPERTYEX()
fungsi.
SELECT DATABASEPROPERTYEX('Music','IsAnsiNullsEnabled');
Hasil:
1
Seperti yang disebutkan, Anda dapat mengganti setelan ini saat menulis kueri ad hoc dengan menyetelnya pada tingkat sesi seperti yang kita lakukan sebelumnya.
Sementara kita berada di topik, saya harus menyebutkan bahwa database SQL Server juga memiliki ANSI_NULL_DEFAULT
pengaturan. Pengaturan ini menentukan nilai default, NULL
atau IS NOT NULL
, dari kolom atau tipe yang ditentukan pengguna CLR yang nullability-nya tidak didefinisikan secara eksplisit di CREATE TABLE
atau ALTER TABLE
pernyataan.
Nilai ini dapat diatur seperti ini:
ALTER DATABASE CURRENT
SET ANSI_NULL_DEFAULT ON;
Nilainya dapat diambil seperti ini:
SELECT DATABASEPROPERTYEX('Music','IsAnsiNullDefault');
Hasil:
1
Anda juga dapat menggunakan sys.databases
tampilan katalog untuk mengembalikan pengaturan ini untuk semua database.
SELECT
name,
is_ansi_nulls_on,
is_ansi_null_default_on
FROM sys.databases
ORDER BY name ASC;