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 NULL
và IS 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 NULL
và 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;
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ớiNULL
đánh giá giá trị thànhUNKNOWN
. - Khi được đặt thành
OFF
, so sánh các giá trị không phải Unicode vớiNULL
đánh giá giá trị thànhTRUE
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;