Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Giải thích về ANSI_NULLS của Máy chủ SQL

Trong SQL Server, ANSI_NULLS cài đặt cho phép bạn chỉ định cách NULL các giá trị được xử lý trong các truy vấn.

Cụ thể hơn, nó cho phép bạn chỉ định hành vi tuân thủ ISO của Equals (= ) và Không Bằng (<> ) các toán tử so sánh khi chúng được sử dụng với NULL giá trị.

ANSI_NULLS có thể được đặt thành ON hoặc OFF . A NULL kiểm tra trả về true với ANSI_NULLS OFF thực sự có thể trả về false với ANSI_NULLS ON .

Đây có thể là nguồn gốc của nhiều nhầm lẫn và do đó, bạn cần phải hiểu chính xác cách thức ANSI_NULLS làm.

ANSI_NULLS cài đặt có thể được đặt ở cấp cơ sở dữ liệu và ở cấp phiên. Nếu một ANSI_NULLS cài đặt ở cấp phiên không được chỉ định, SQL Server sẽ sử dụng ANSI_NULLS nào cài đặt được áp dụng cho cơ sở dữ liệu hiện tại. Do đó, bạn có thể ghi đè cài đặt cơ sở dữ liệu bằng cài đặt cấp phiên của riêng bạn khi viết các truy vấn đặc biệt.

Một điều quan trọng cần lưu ý là trình điều khiển ODBC SQL Server Native Client và Nhà cung cấp SQL Server Native Client OLE DB cho SQL Server tự động đặt ANSI_NULLS thành ON khi kết nối. Cài đặt này có thể được định cấu hình trong nguồn dữ liệu ODBC, trong thuộc tính kết nối ODBC hoặc trong thuộc tính kết nối OLE DB được đặt trong ứng dụng trước khi kết nối với một phiên bản của SQL Server.

Cách kiểm tra cài đặt ANSI_NULLS cho phiên của bạn

Bạn có thể sử dụng SESSIONPROPERTY() chức năng kiểm tra ANSI_NULLS cài đặt cho phiên hiện tại.

SELECT SESSIONPROPERTY('ANSI_NULLS');

Kết quả:

+--------------------+
| (No column name)   |
|--------------------|
| 1                  |
+--------------------+

Trong trường hợp này, ANSI_NULLS cài đặt cho phiên của tôi là ON .

Số 0 (0 ) có nghĩa là nó đã tắt.

Cách thay đổi cài đặt ANSI_NULLS cho phiên của bạn

Bạn có thể đặt cài đặt ANSI_NULLS của phiên thành OFF với mã sau:

SET ANSI_NULLS OFF;

Sau đó, kiểm tra lại nó sẽ cho ra kết quả là số không.

SELECT SESSIONPROPERTY('ANSI_NULLS');

Kết quả:

+--------------------+
| (No column name)   |
|--------------------|
| 0                  |
+--------------------+

Giá trị mặc định cho SET ANSI_NULLS OFF . Tuy nhiên, như đã đề cập ở trên, trình điều khiển ODBC SQL Server Native Client và Nhà cung cấp SQL Server Native Client OLE DB cho SQL Server tự động đặt ANSI_NULLS thành ON khi kết nối.

Ví dụ về Cách làm ANSI_NULLS Ảnh hưởng đến các truy vấn

Dưới đây là một số ví dụ cơ bản để chứng minh các kết quả khác nhau mà bạn có thể nhận được, tùy thuộc vào giá trị của ANSI_NULLS cài đặt.

Chúng sử dụng SET ANSI_NULLS để chuyển đổi ANSI_NULLS cài đặt cho phiên hiện tại.

ANSI_NULLS ON

SET ANSI_NULLS ON;

SELECT NULL
WHERE NULL = NULL;

Kết quả:

(0 rows affected)

Khi ANSI_NULLS ON , tất cả các so sánh với NULL đánh giá giá trị thành UNKNOWN .

Trong trường hợp này, chúng tôi không thể nói chính xác rằng NULL bằng NULL bởi vì mỗi giá trị là không xác định.

Do đó, không có hàng nào được trả lại cho truy vấn trên.

ANSI_NULLS OFF

SET ANSI_NULLS OFF;

SELECT NULL
WHERE NULL = NULL;

Kết quả:

+--------------------+
| (No column name)   |
|--------------------|
| NULL               |
+--------------------+

Khi ANSI_NULLS OFF , so sánh tất cả dữ liệu với NULL đánh giá giá trị thành TRUE nếu giá trị dữ liệu là NULL .

Logic tương tự cũng áp dụng khi sử dụng toán tử Không Bằng Với (<> ).

Hãy mở rộng ví dụ để bao gồm toán tử Không Bằng Với (<> ), cũng như so sánh giữa NULL và không phải NULL giá trị.

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;

Kết quả:

(0 rows affected)
(0 rows affected)
(0 rows affected)
(0 rows affected)

Như mong đợi, không có hàng nào được trả lại cho bất kỳ truy vấn nào. Điều này là do NULL các giá trị được coi là một UNKNOWN giá trị khi ANSI_NULLS 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;

Kết quả:

+--------------------+
| (No column name)   |
|--------------------|
| NULL               |
+--------------------+
(1 row affected)
(0 rows affected)
(0 rows affected)
+--------------------+
| (No column name)   |
|--------------------|
| Not NULL           |
+--------------------+
(1 row affected)

Chúng tôi nhận được một kết quả khác khi ANSI_NULLS OFF .

Trong trường hợp này, SQL Server không xử lý NULL dưới dạng UNKNOWN . Nó xác định rằng NULL thực tế là bằng NULL .

Điều này không tuân thủ tiêu chuẩn ANSI.

IS NULL Vị ngữ

Để tập lệnh hoạt động như dự định, bất kể ANSI_NULLS tùy chọn cơ sở dữ liệu hoặc cài đặt của SET ANSI_NULLS , sử dụng IS NULLIS NOT NULL trong các so sánh có thể chứa giá trị rỗng

Đây là những gì sẽ xảy ra khi chúng tôi viết lại ví dụ trước đó để sử dụng IS NULLIS 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;

Kết quả:

+--------------------+
| (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;

Kết quả:

+--------------------+
| (No column name)   |
|--------------------|
| NULL               |
+--------------------+
(1 row affected)
(0 rows affected)
(0 rows affected)
+--------------------+
| (No column name)   |
|--------------------|
| Not NULL           |
+--------------------+
(1 row affected)

Như mong đợi, chúng tôi nhận được cùng một kết quả bất kể ANSI_NULLS cài đặt.

Bảng so sánh

Bảng sau đây phác thảo các biến thể bạn có thể nhận được tùy thuộc vào biểu thức Boolean và ANSI_NULLS cài đặt.

Biểu thức Boolean BẬT ANSI_NULLS ĐẶT TẮT ANSI_NULLS
NULL =NULL KHÔNG BIẾT ĐÚNG
1 =NULL KHÔNG BIẾT SAI
NULL <> NULL KHÔNG BIẾT SAI
1 <> NULL KHÔNG BIẾT ĐÚNG
NULL> KHÔNG KHÔNG BIẾT KHÔNG BIẾT
1> KHÔNG ĐỦ KHÔNG BIẾT KHÔNG BIẾT
KHÔNG ĐẦY ĐỦ ĐÚNG ĐÚNG
1 LÀ KHÔNG ĐẦY ĐỦ SAI SAI
KHÔNG ĐẦY ĐỦ SAI SAI
1 KHÔNG ĐẦY ĐỦ ĐÚNG ĐÚNG

Đặt ANSI_NULLS ở Cấp cơ sở dữ liệu

Mỗi cơ sở dữ liệu SQL Server có một ANSI_NULLS cài đặt, xác định cách so sánh với NULL các giá trị được đánh giá.

  • Khi được đặt thành ON , so sánh với NULL đánh giá giá trị thành UNKNOWN .
  • Khi được đặt thành OFF , so sánh các giá trị không phải Unicode với NULL đánh giá giá trị thành TRUE nếu cả hai giá trị đều là NULL .

Bạn có thể thay đổi cài đặt này trên cơ sở dữ liệu bằng mã sau:

ALTER DATABASE CURRENT
SET ANSI_NULLS ON;

Điều đó đặt ANSI_NULLS thành ON cho cơ sở dữ liệu hiện tại. Bạn có thể hoán đổi CURRENT với tên của cơ sở dữ liệu nếu được ưu tiên.

Bạn có thể kiểm tra cài đặt hiện tại bằng DATABASEPROPERTYEX() chức năng.

SELECT DATABASEPROPERTYEX('Music','IsAnsiNullsEnabled');

Kết quả:

1

Như đã đề cập, bạn có thể ghi đè cài đặt này khi viết các truy vấn đặc biệt bằng cách đặt nó ở cấp phiên như chúng ta đã làm trước đó.

Trong khi chúng ta đang nói về chủ đề này, tôi nên đề cập rằng cơ sở dữ liệu SQL Server cũng có ANSI_NULL_DEFAULT thiết lập. Cài đặt này xác định giá trị mặc định, NULL hoặc NOT NULL , thuộc loại cột hoặc CLR do người dùng xác định mà khả năng vô hiệu không được xác định rõ ràng trong CREATE TABLE hoặc ALTER TABLE các câu lệnh.

Giá trị này có thể được đặt như sau:

ALTER DATABASE CURRENT
SET ANSI_NULL_DEFAULT ON;

Giá trị của nó có thể được truy xuất như thế này:

SELECT DATABASEPROPERTYEX('Music','IsAnsiNullDefault');

Kết quả:

1

Bạn cũng có thể sử dụng sys.databases xem danh mục để trả về các cài đặt này cho tất cả các cơ sở dữ liệu.

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. SQL:GIỮA với <=và> =

  2. Cách phân tích hoạt động của một cơ sở dữ liệu trong SQL Server

  3. Thủ thuật điều chỉnh hiệu suất yêu thích

  4. Có gì mới trong SQL Server 2019?

  5. Chuyển đổi trong một phân vùng trong SQL Server (T-SQL)