Поделиться через


SET ANSI_WARNINGS (Transact-SQL)

Задает поведение в соответствии со стандартом ISO для некоторых условий ошибок.

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

SET ANSI_WARNINGS { ON | OFF }

Замечания

Инструкция SET ANSI_WARNINGS влияет на следующие условия.

  • Если значения NULL появляются в статистических функциях, таких как SUM, AVG, MAX, MIN, STDEV, STDEVP, VAR, VARP или COUNT, то при установке значения ON формируется предупреждающее сообщение. При установке значения OFF предупреждения не формируются.

  • Если задано значение ON, то для инструкции, выполнение которой привело к ошибке деления на ноль или арифметического переполнения, будет выполнен откат и сформировано сообщение об ошибке. Если установлено значение OFF, то ошибки деления на ноль и арифметического переполнения приведут к возврату значений NULL. Ситуация, при которой ошибки деления на ноль и арифметического переполнения приводят к возврату значения NULL, возникает, если инструкция INSERT или UPDATE выполняется над столбцом типа character, binary или Юникод, в котором длина нового значения превышает максимальное значение для столбца. Если значение SET ANSI_WARNINGS установлено в ON, то выполнение инструкции INSERT или UPDATE прекращается в соответствии со стандартом ISO. Конечные пробелы игнорируются для символьных столбцов, а конечные значения NULL игнорируются для бинарных столбцов. Если указано значение OFF, то данные усекаются до размера столбца, и инструкция успешно завершается.

    ПримечаниеПримечание

    Если усечение возникает во время преобразования в тип данных binary или varbinary или из этих типов данных, то не возникает ошибок или предупреждений, несмотря на значения параметров SET.

    ПримечаниеПримечание

    Значение ANSI_WARNINGS игнорируется при передаче аргументов хранимой процедуре или пользовательской функции, а также при объявлении и настройке переменных в инструкции пакетных заданий. Например, если объявить переменную типа char(3), а затем присвоить ей значение длиннее трех символов, данные будут усечены до размера переменной, а инструкция INSERT или UPDATE завершится без ошибок.

Можно использовать параметр user options процедуры sp_configure для установки параметра ANSI_WARNINGS в значение по умолчанию для всех соединений с сервером. Дополнительные сведения см. в разделе sp_configure (Transact-SQL) или Установка параметров конфигурации сервера.

Параметр SET ANSI_WARNINGS должен иметь значение ON при создании или изменении индексов, основанных на вычисляемых столбцах или индексированных представлениях. Если параметр SET ANSI_WARNINGS установлен в значение OFF, то выполнение инструкций CREATE, UPDATE, INSERT и DELETE на таблицах с индексами, основанными на вычисляемых столбцах или на индексированных представлениях, будет завершаться ошибкой. Дополнительные сведения о настройке требуемых параметров SET с индексированными представлениями и индексами на вычисляемых столбцах см. в подразделе «Анализ использования инструкций SET» раздела SET (Transact-SQL).

В SQL Server существует параметр базы данных 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 использует значение столбца is_ansi_warnings_on в представлении каталога sys.databases. Дополнительные сведения см. в разделе Установка параметров базы данных.

Параметр ANSI_WARNINGS должен быть установлен в ON для выполнения распределенных запросов.

Драйвер ODBC для собственного клиента SQL Server и поставщик OLE DB для собственного клиента SQL Server при соединении автоматически устанавливают параметр ANSI_WARNINGS в значение ON. Это можно настроить в источниках данных ODBC, в атрибутах соединения ODBC, установленных в приложении перед сеансом связи. Для соединений от приложений 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.

Примеры

Следующий пример демонстрирует три рассмотренные ситуации со значениями ON и OFF для параметра SET ANSI_WARNINGS.

USE AdventureWorks2008R2;
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