SET ANSI_WARNINGS (Transact-SQL)

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics 分析平台系统 (PDW) Microsoft Fabric 中的 SQL 分析端点 Microsoft Fabric 中的仓库

对几种错误情况指定 ISO 标准行为。

Transact-SQL 语法约定

语法

SQL Server、Azure Synapse Analytics 中的无服务器 SQL 池和 Microsoft Fabric 的语法

SET ANSI_WARNINGS { ON | OFF }

Azure Synapse Analytics 和 Analytics Platform System (PDW) 的语法

SET ANSI_WARNINGS ON

注解

SET ANSI_WARNINGS 可以影响下列情况:

  • 设置为 ON 时,如果聚合函数(如 SUM、AVG、MAX、MIN、STDEV、STDEVP、VAR、VARP 或 COUNT)中出现空值,将生成警告消息。 设置为 OFF 时,不发出警告。

  • 设置为 ON 时,被零除错误和算术溢出错误将导致回滚语句,并生成错误消息。 设置为 OFF 时,被零除错误和算术溢出错误将导致返回空值。 如果尝试对 character、Unicode 或 binary 列执行 INSERT 或 UPDATE 操作,而这些列中的新值长度超出列的最大大小,那么,在发生被零除错误或算术溢出错误时,将导致返回 NULL 值 。 如果 SET ANSI_WARNINGS 为 ON,则根据 ISO 标准,将取消 INSERT 或 UPDATE。 字符列的尾随空格和二进制列的尾随零都将被忽略。 设置为 OFF 时,数据将剪裁为列的大小,并且语句执行成功。

注意

在 binary 或 varbinary 数据转换中发生截断时,不管 SET 选项如何设置,都不发出警告或错误消息 。

备注

在存储过程和用户定义函数中传递参数,或者在批处理语句中声明和设置变量时,不执行 ANSI_WARNINGS。 例如,如果将一个变量定义为 char(3),然后将其值设置为大于三个字符,则数据会被截断为定义的大小,并且 INSERT 或 UPDATE 语句可以成功执行 。

可以使用用户选项选项 sp_configure 为与服务器的所有连接设置ANSI_WARNINGS默认设置。 有关详细信息,请参阅 sp_configure (Transact-SQL)

创建或操作对索引视图或计算列的索引时,ANSI_WARNINGS 必须为 ON。 如果 SET ANSI_WARNINGS 为 OFF,对计算列或索引视图的索引所在的表执行 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。 有关计算列的索引视图和索引需要的 SET 选项设置的详细信息,请参阅 SET 语句 (Transact-SQL) 中的“使用 SET 语句时的注意事项”。

SQL Server 包含 ANSI_WARNINGS 数据库选项。 此选项与 SET ANSI_WARNINGS 等效。 如果 SET ANSI_WARNINGS 为 ON,则发生被零除、字符串超出数据库列及其他类似错误时,将引发错误或警告。 如果 SET ANSI_WARNINGS 为 OFF,则不会引发这些错误和警告。 SET ANSI_WARNINGS数据库中 model 的默认值为 OFF。 如果未指定,则应用 ANSI_WARNINGS 设置。 如果 SET ANSI_WARNINGS 为 OFF,则 SQL Server 使用 sys.databases 目录视图中 is_ansi_warnings_on 列的值。

重要

执行分布式查询时,应将 ANSI_WARNINGS 设置为 ON。

客户端(如 SQL Server Native Client ODBC 驱动程序、SQL Server Native Client OLE DB Provider for SQL Server 和 Microsoft JDBC Driver for SQL Server)自动使用连接标志将 ANSI_WARNINGS 设置为 ON。 这可以在 ODBC 数据源、ODBC 连接属性(它们在连接前在应用程序中设置)中进行配置。 从 DB-Library 应用程序连接时,SET ANSI_WARNINGS 的默认值为 OFF。 有关详细信息,请参阅表格格式数据流 (TDS) 协议规范中的 LOGIN7

ANSI_DEFAULTS 为 ON 时,将启用 ANSI_WARNINGS。

ANSI_WARNINGS 的设置是在执行或运行时定义的,而不是在分析时定义的。 与所有 SET 语句一样,SET ANSI_WARNINGS会影响当前会话。

如果 SET ARITHABORT 或 SET ARITHIGNORE 为 OFF,而 SET ANSI_WARNINGS 为 ON,则遇到被零除或溢出错误时,SQL Server 仍会返回错误消息。

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

DECLARE @ANSI_WARN VARCHAR(3) = 'OFF';  
IF ( (8 & @@OPTIONS) = 8 ) SET @ANSI_WARN = 'ON';  
SELECT @ANSI_WARN AS ANSI_WARNINGS;  

权限

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

示例

下面的示例阐释了 SET ANSI_WARNINGS 为 ON 和 OFF 时的上述三种情况。

CREATE TABLE T1   
(  
   a int,   
   b int NULL,   
   c varchar(20)  
);  
GO  
  
SET NOCOUNT ON;  
  
INSERT INTO T1   
VALUES (1, NULL, '')   
      ,(1, 0, '')  
      ,(2, 1, '')  
      ,(2, 2, '');  
  
SET NOCOUNT OFF;  
GO  

现在将 ANSI_WARNINGS 设置为 ON 并测试。

PRINT '**** Setting ANSI_WARNINGS ON';  
GO  
  
SET ANSI_WARNINGS ON;  
GO  
  
PRINT 'Testing NULL in aggregate';  
GO  
SELECT a, SUM(b)   
FROM T1   
GROUP BY a;  
GO  
  
PRINT 'Testing String Overflow in INSERT';  
GO  
INSERT INTO T1   
VALUES (3, 3, 'Text string longer than 20 characters');  
GO  
  
PRINT 'Testing Divide by zero';  
GO  
SELECT a / b AS ab   
FROM T1;  
GO  

现在将 ANSI_WARNINGS 设置为 OFF 并测试。

PRINT '**** Setting ANSI_WARNINGS OFF';  
GO  
SET ANSI_WARNINGS OFF;  
GO  
  
PRINT 'Testing NULL in aggregate';  
GO  
SELECT a, SUM(b)   
FROM T1   
GROUP BY a;  
GO  
  
PRINT 'Testing String Overflow in INSERT';  
GO  
INSERT INTO T1   
VALUES (4, 4, 'Text string longer than 20 characters');  
GO  
SELECT a, b, c   
FROM T1  
WHERE a = 4;  
GO  
  
PRINT 'Testing Divide by zero';  
GO  
SELECT a / b AS ab   
FROM T1;  
GO  
  
DROP TABLE T1;