SET ANSI_WARNINGS (Transact-SQL)
Задает поведение в соответствии со стандартом ISO для некоторых условий ошибок.
Синтаксис
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