SET ANSI_WARNINGS (Transact-SQL)

指定几种错误情况下的 SQL-92 标准行为。

主题链接图标Transact-SQL 语法约定

语法

SET ANSI_WARNINGS { ON | OFF }

备注

SET ANSI_WARNINGS 可以影响下列情况:

  • 设置为 ON 时,如果聚合函数(如 SUM、AVG、MAX、MIN、STDEV、STDEVP、VAR、VARP 或 COUNT)中出现空值,将生成警告消息。设置为 OFF 时,不发出警告。
  • 设置为 ON 时,被零除错误和算术溢出错误将导致回滚语句,并生成错误消息。设置为 OFF 时,被零除错误和算术溢出错误将导致返回空值。如果在 character、Unicode 或 binary 列上尝试执行 INSERT 或 UPDATE 操作,而这些列中的新值长度超出最大列大小,则将出现被零除错误和算术溢出错误导致返回空值的行为。如果 SET ANSI_WARNINGS 为 ON,则将按 SQL-92 标准的规定取消 INSERT 或 UPDATE。字符列的尾随空格和二进制列的尾随零都将被忽略。设置为 OFF 时,数据将剪裁为列的大小,并且语句执行成功。
    ms190368.note(zh-cn,SQL.90).gif注意:
    binaryvarbinary 数据转换中发生截断时,不管 SET 选项如何设置,都不发出警告或错误消息。
    ms190368.note(zh-cn,SQL.90).gif注意:
    在存储过程和用户定义函数中传递参数,或者在批处理语句中声明和设置变量时,不执行 ANSI_WARNINGS。例如,如果一个变量被定义为 char(3),但后来将该参数设置为一个大于三个字符的值,则数据将被截断为定义的大小,并且 INSERT 或 UPDATE 语句将执行成功。

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

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

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

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

SQL Server 的 SQL Native Client ODBC 驱动程序和 SQL Native Client OLE DB 访问接口在连接时会自动将 ANSI_WARNINGS 设置为 ON。这可以在 ODBC 数据源、ODBC 连接特性或 OLE DB 连接属性(它们在连接前在应用程序中设置)中进行配置。从 DB-Library 应用程序连接时,SET ANSI_WARNINGS 的默认值为 OFF。

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

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

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

权限

要求具有 public 角色的成员身份。

示例

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

USE AdventureWorks;
GO

CREATE TABLE T1 (
   a INT, 
   b INT NULL, 
   c VARCHAR(20)
);
GO

SET NOCOUNT ON

INSERT INTO T1 
VALUES (1, NULL, '');
INSERT INTO T1 
VALUES (1, 0, '');
INSERT INTO T1 
VALUES (2, 1, '');
INSERT INTO T1 
VALUES (2, 2, '');

SET NOCOUNT OFF;
GO
  
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
  
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

请参阅

参考

INSERT (Transact-SQL)
SELECT (Transact-SQL)
SET (Transact-SQL)
SET ANSI_DEFAULTS (Transact-SQL)
SESSIONPROPERTY (Transact-SQL)

帮助和信息

获取 SQL Server 2005 帮助