SET ANSI_NULL_DFLT_ON (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库

当数据库的 ANSI null default 选项为 false 时,修改会话的行为以覆盖新列的默认为 Null 性。 有关设置 ANSI null default 的值的详细信息,请参阅 ALTER DATABASE (Transact-SQL)

Transact-SQL 语法约定

语法

-- Syntax for SQL Server and Azure SQL Database and Microsoft Fabric

SET ANSI_NULL_DFLT_ON {ON | OFF}
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse

SET ANSI_NULL_DFLT_ON ON

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

注解

仅当在 CREATE TABLE 和 ALTER TABLE 语句中没有指定列的为空性时,该设置才能影响新列的为空性。 SET ANSI_NULL_DFLT_ON 为 ON 时,如果没有显式指定列的为空性状态,则使用 ALTER TABLE 和 CREATE TABLE 语句创建的新列可以使用空值。 SET ANSI_NULL_DFLT_ON 对使用显式 NULL 或 NOT NULL 创建的列无效。

不能同时将 SET ANSI_NULL_DFLT_OFF 和 SET ANSI_NULL_DFLT_ON 设置为 ON。 如果将一个选项设置为 ON,则将另一个选项设置为 OFF。 因此,可以将 ANSI_NULL_DFLT_OFF 或 ANSI_NULL_DFLT_ON 设置为 ON,或者将二者都设置为 OFF。 如果有一个选项为 ON,则该设置(SET ANSI_NULL_DFLT_OFF 或 SET ANSI_NULL_DFLT_ON)生效。 如果将这两个选项都设置为 OFF,则 SQL Server 将使用 sys.databases 目录视图中 is_ansi_null_default_on 列的值。

为使 Transact-SQL 脚本在含有不同为空性设置的数据库中获得更可靠的操作,最好始终在 CREATE TABLE 和 ALTER TABLE 语句中指定 NULL 或 NOT NULL。

SQL Server 的 SQL Server Native Client ODBC 驱动程序和 SQL Server Native Client OLE DB 提供程序在连接时会自动将 ANSI_NULL_DFLT_ON 设置为 ON。 对于来自 DB-Library 应用程序的连接,SET ANSI_NULL_DFLT_ON 的默认设置为 OFF。

SET ANSI_DEFAULTS 为 ON 时,将启用 SET ANSI_NULL_DFLT_ON。

SET ANSI_NULL_DFLT_ON 的设置是在执行或运行时设置的,而不是在分析时设置的。

在使用 SELECT INTO 语句创建表时,SET ANSI_NULL_DFLT_ON 的设置不适用。

要查看此设置的当前设置,请运行以下查询。

DECLARE @ANSI_NULL_DFLT_ON VARCHAR(3) = 'OFF';  
IF ( (1024 & @@OPTIONS) = 1024 ) SET @ANSI_NULL_DFLT_ON = 'ON';  
SELECT @ANSI_NULL_DFLT_ON AS ANSI_NULL_DFLT_ON;  
  

权限

要求 公共 角色具有成员身份。

示例

以下示例显示当 ANSI null default 数据库选项在两种设置下时,对 SET ANSI_NULL_DFLT_ON 的影响。

USE AdventureWorks2022;  
GO  
  
-- The code from this point on demonstrates that SET ANSI_NULL_DFLT_ON  
-- has an effect when the 'ANSI null default' for the database is false.  
-- Set the 'ANSI null default' database option to false by executing  
-- ALTER DATABASE.  
ALTER DATABASE AdventureWorks2022 SET ANSI_NULL_DEFAULT OFF;  
GO  
-- Create table t1.  
CREATE TABLE t1 (a TINYINT) ;  
GO   
-- NULL INSERT should fail.  
INSERT INTO t1 (a) VALUES (NULL);  
GO  
  
-- SET ANSI_NULL_DFLT_ON to ON and create table t2.  
SET ANSI_NULL_DFLT_ON ON;  
GO  
CREATE TABLE t2 (a TINYINT);  
GO   
-- NULL insert should succeed.  
INSERT INTO t2 (a) VALUES (NULL);  
GO  
  
-- SET ANSI_NULL_DFLT_ON to OFF and create table t3.  
SET ANSI_NULL_DFLT_ON OFF;  
GO  
CREATE TABLE t3 (a TINYINT);  
GO  
-- NULL insert should fail.  
INSERT INTO t3 (a) VALUES (NULL);  
GO  
  
-- The code from this point on demonstrates that SET ANSI_NULL_DFLT_ON   
-- has no effect when the 'ANSI null default' for the database is true.  
-- Set the 'ANSI null default' database option to true.  
ALTER DATABASE AdventureWorks2022 SET ANSI_NULL_DEFAULT ON  
GO  
  
-- Create table t4.  
CREATE TABLE t4 (a TINYINT);  
GO   
-- NULL INSERT should succeed.  
INSERT INTO t4 (a) VALUES (NULL);  
GO  
  
-- SET ANSI_NULL_DFLT_ON to ON and create table t5.  
SET ANSI_NULL_DFLT_ON ON;  
GO  
CREATE TABLE t5 (a TINYINT);  
GO   
-- NULL INSERT should succeed.  
INSERT INTO t5 (a) VALUES (NULL);  
GO  
  
-- SET ANSI_NULL_DFLT_ON to OFF and create table t6.  
SET ANSI_NULL_DFLT_ON OFF;  
GO  
CREATE TABLE t6 (a TINYINT);  
GO   
-- NULL INSERT should succeed.  
INSERT INTO t6 (a) VALUES (NULL);  
GO  
  
-- Set the 'ANSI null default' database option to false.  
ALTER DATABASE AdventureWorks2022 SET ANSI_NULL_DEFAULT ON;  
GO  
  
-- Drop tables t1 through t6.  
DROP TABLE t1,t2,t3,t4,t5,t6;  

另请参阅

ALTER TABLE (Transact-SQL)
CREATE TABLE (Transact-SQL)
SET 语句 (Transact-SQL)
SET ANSI_DEFAULTS (Transact-SQL)
SET ANSI_NULL_DFLT_OFF (Transact-SQL)