Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SQL Server ANSI_NULLS Dijelaskan

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 dengan NULL nilai mengevaluasi ke UNKNOWN .
  • Bila disetel ke OFF , perbandingan nilai non-Unicode dengan NULL nilai mengevaluasi ke TRUE jika kedua nilai adalah NULL .

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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara membuat fungsi SQL Server untuk menggabungkan beberapa baris dari subquery ke dalam satu bidang yang dibatasi?

  2. Bagaimana cara mengeksekusi file .sql menggunakan powershell?

  3. Tablix:Ulangi baris tajuk pada setiap halaman tidak berfungsi - Pembuat Laporan 3.0

  4. SQL Server 2016:Buat Login

  5. Tidak dapat menemukan microsoft.sqlserver.batchparser.dll