Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL Database w Microsoft Fabric
Określa zachowanie zgodne ze standardem ISO operatorów porównania Equals (=) i Not Equal To (<>), gdy są one używane z wartościami NULL w programie SQL Server.
-
SET ANSI_NULLS ON- Oblicza zarówno ,{expression} = NULLjak i{expression} <> NULLtak, jakbyFalsewartość parametru{expression}toNULL. To zachowanie jest zgodne ze standardem ANSI. -
SET ANSI_NULLS OFF- Ocenia{expression} = NULLjako iTrue{expression} <> NULLtak, jakbyFalsewartość parametru{expression}toNULL. To zachowanie nie jest zalecane, ponieważNULLwartości nie powinny być porównywane przy użyciu=operatorów i<>.
Uwaga / Notatka
SET ANSI_NULLS OFF
ANSI_NULLS OFF opcja bazy danych jest przestarzała. Począwszy od programu SQL Server 2017 (14.x), ANSI_NULLS jest zawsze ustawiona na wartość WŁĄCZONE. Przestarzałe funkcje nie powinny być używane w nowych aplikacjach. Aby uzyskać więcej informacji, zobacz Przestarzałe funkcje aparatu bazy danych w programie SQL Server 2017.
Transact-SQL konwencje składni
Składnia
Składnia dla programu SQL Server, bezserwerowej puli SQL w usłudze Azure Synapse Analytics, Microsoft Fabric
SET ANSI_NULLS { ON | OFF }
Składnia dla usługi Azure Synapse Analytics i systemu platformy analizy (PDW)
SET ANSI_NULLS ON
Uwagi
Gdy ANSI_NULLS jest włączona, instrukcja używająca SELECTWHERE column_name = NULL zwraca zero wierszy, nawet jeśli w column_name istnieją wartości NULL. Instrukcja SELECT , która używa WHERE column_name <> NULL zerowych wierszy, nawet jeśli w column_name istnieją wartości inne niż NULL.
Gdy ANSI_NULLS jest wyłączona, operatory porównania Equals (=) i Not Equal To (<>) nie są zgodne ze standardem ISO. Instrukcja SELECT , która używa WHERE column_name = NULL , zwraca wiersze, które mają wartości null w column_name. Instrukcja SELECT , która używa WHERE column_name <> NULL , zwraca wiersze, które mają wartości inneNULL niż w kolumnie. Ponadto instrukcja SELECT , która używa WHERE column_name <> XYZ_value , zwraca wszystkie wiersze, które nie są XYZ_value i które nie NULLsą .
Gdy ANSI_NULLS wartość jest włączona, wszystkie porównania z wartością null są obliczane na WARTOŚĆ UNKNOWN. Gdy SET ANSI_NULLS wartość jest wyłączona, porównania wszystkich danych z wartością null są obliczane na wartość TRUE, jeśli wartość danych to NULL. Jeśli SET ANSI_NULLS nie zostanie określony, ma zastosowanie ustawienie ANSI_NULLS opcji bieżącej bazy danych. Aby uzyskać więcej informacji na temat ANSI_NULLS opcji bazy danych, zobacz ALTER DATABASE (Transact-SQL).
W poniższej tabeli pokazano, jak ustawienie ANSI_NULLS funkcji wpływa na wyniki wyrażeń logicznych przy użyciu wartości null i wartości innych niż null.
| Wyrażenie logiczne | USTAW ANSI_NULLS WŁĄCZONE | USTAW ANSI_NULLS WYŁĄCZONE |
|---|---|---|
NULL = NULL |
NIEZNANY | PRAWIDŁOWE |
1 = NULL |
NIEZNANY | FAŁSZYWY |
NULL <> NULL |
NIEZNANY | FAŁSZYWY |
1 <> NULL |
NIEZNANY | PRAWIDŁOWE |
NULL > NULL |
NIEZNANY | NIEZNANY |
1 > NULL |
NIEZNANY | NIEZNANY |
NULL IS NULL |
PRAWIDŁOWE | PRAWIDŁOWE |
1 IS NULL |
FAŁSZYWY | FAŁSZYWY |
NULL IS NOT NULL |
FAŁSZYWY | FAŁSZYWY |
1 IS NOT NULL |
PRAWIDŁOWE | PRAWIDŁOWE |
SET ANSI_NULLS ON ma wpływ na porównanie tylko wtedy, gdy jeden z operandów porównania jest zmienną, która jest NULL lub literałem NULL. Jeśli obie strony porównania to kolumny lub wyrażenia złożone, ustawienie nie ma wpływu na porównanie.
Aby skrypt działał zgodnie z ANSI_NULLS oczekiwaniami, niezależnie od opcji bazy danych lub ustawienia SET ANSI_NULLS, użyj polecenia IS NULL i IS NOT NULL w porównaniach, które mogą zawierać wartości null.
ANSI_NULLS należy ustawić wartość WŁĄCZONE na potrzeby wykonywania zapytań rozproszonych.
ANSI_NULLS Podczas tworzenia lub zmieniania indeksów w kolumnach obliczeniowych lub widokach indeksowanych muszą być również włączone. Jeśli właściwość SET ANSI_NULLS jest wyłączona, wszystkie CREATEinstrukcje , UPDATE, INSERTi DELETE w tabelach z indeksami w obliczonych kolumnach lub indeksowanych widokach kończą się niepowodzeniem. Program SQL Server zwraca błąd, który wyświetla listę wszystkich opcji ZESTAWU, które naruszają wymagane wartości. Ponadto podczas wykonywania SELECT instrukcji, jeśli SET ANSI_NULLS jest wyłączona, program SQL Server ignoruje wartości indeksu dla obliczonych kolumn lub widoków i rozwiąże operację wybierania tak, jakby nie było takich indeksów w tabelach lub widokach.
Uwaga / Notatka
ANSI_NULLS jest jedną z siedmiu opcji ZESTAWU, które muszą być ustawione na wymagane wartości podczas pracy z indeksami w obliczonych kolumnach lub widokach indeksowanych. Opcje ANSI_PADDING, , ANSI_WARNINGSARITHABORT, QUOTED_IDENTIFIERi CONCAT_NULL_YIELDS_NULL muszą być również ustawione na WŁĄCZONE i NUMERIC_ROUNDABORT muszą być ustawione na WARTOŚĆ WYŁĄCZONE.
Sterownik ODBC klienta natywnego programu SQL Server i dostawca OLE DB klienta natywnego programu SQL Server dla programu SQL Server automatycznie ustawić wartość ANSI_NULLS WŁĄCZONE podczas nawiązywania połączenia. To ustawienie można skonfigurować w źródłach danych ODBC, w atrybutach połączenia ODBC lub we właściwościach połączenia OLE DB ustawionych w aplikacji przed nawiązaniem połączenia z wystąpieniem programu SQL Server. Wartość domyślna to SET ANSI_NULLS OFF.
Gdy ANSI_DEFAULTS jest włączona, ANSI_NULLS jest włączona.
Ustawienie elementu jest definiowane ANSI_NULLS w czasie wykonywania lub wykonywania, a nie w czasie analizy.
Aby wyświetlić bieżące ustawienie dla tego ustawienia, uruchom następujące zapytanie:
DECLARE @ANSI_NULLS VARCHAR(3) = 'OFF';
IF ( (32 & @@OPTIONS) = 32 ) SET @ANSI_NULLS = 'ON';
SELECT @ANSI_NULLS AS ANSI_NULLS;
Uprawnienia
Wymaga członkostwa w publicznej roli .
Przykłady
W poniższym przykładzie użyto operatorów porównania Equals (=) i Not Equal To (<>) w celu porównania z NULL zmienną lub 0 i null wartością w zmiennej.
SET ANSI_NULLS OFF
DECLARE @var INT = NULL
SELECT
IIF(@var = NULL, 'True', 'False') as EqualNull,
IIF(@var <> NULL, 'True', 'False') as DifferentNull,
IIF(@var = 0, 'True', 'False') as EqualZero,
IIF(@var <> 0, 'True', 'False') as DifferentZero
Wyniki są wyświetlane w poniższej tabeli.
| EqualNull (Równa wartość null) | RóżneNull | EqualZero (Równowartość Zero) | RóżneZero |
|---|---|---|---|
| Prawda | Nieprawda | Nieprawda | Prawda |
W przypadku SET ANSI_NULLS ON wszystkich wyrażeń zostanie obliczona jako "Fałsz", ponieważ NULL nie można jej porównać ani NULL0 użyć tych operatorów.
W poniższym przykładzie użyto operatorów porównania Equals (=) i Not Equal To (<>) w celu porównania z wartościami NULL innymi niż null w tabeli. W przykładzie pokazano również, że SET ANSI_NULLS ustawienie nie ma wpływu na IS NULLwartość .
-- Create table t1 and insert values.
CREATE TABLE dbo.t1 (a INT NULL);
INSERT INTO dbo.t1 values (NULL),(0),(1);
GO
-- Print message and perform SELECT statements.
PRINT 'Testing default setting';
DECLARE @varname int;
SET @varname = NULL;
SELECT a
FROM t1
WHERE a = @varname;
SELECT a
FROM t1
WHERE a <> @varname;
SELECT a
FROM t1
WHERE a IS NULL;
GO
Teraz ustaw ANSI_NULLS na WARTOŚĆ WŁ. i przetestuj.
PRINT 'Testing ANSI_NULLS ON';
SET ANSI_NULLS ON;
GO
DECLARE @varname int;
SET @varname = NULL
SELECT a
FROM t1
WHERE a = @varname;
SELECT a
FROM t1
WHERE a <> @varname;
SELECT a
FROM t1
WHERE a IS NULL;
GO
Teraz ustaw ANSI_NULLS na wartość WYŁ. i przetestuj.
PRINT 'Testing ANSI_NULLS OFF';
SET ANSI_NULLS OFF;
GO
DECLARE @varname int;
SET @varname = NULL;
SELECT a
FROM t1
WHERE a = @varname;
SELECT a
FROM t1
WHERE a <> @varname;
SELECT a
FROM t1
WHERE a IS NULL;
GO
-- Drop table t1.
DROP TABLE dbo.t1;