SET ANSI_WARNINGS (Transact-SQL)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в Microsoft Fabric Хранилище в Microsoft Fabric
Задает поведение в соответствии со стандартом ISO для некоторых условий ошибок.
Соглашения о синтаксисе Transact-SQL
Синтаксис
Синтаксис для SQL Server, бессерверный пул SQL в Azure Synapse Analytics, Microsoft Fabric
SET ANSI_WARNINGS { ON | OFF }
Синтаксис для Системы платформы Azure Synapse Analytics и Analytics (PDW)
SET ANSI_WARNINGS ON
Замечания
Инструкция SET ANSI_WARNINGS влияет на следующие условия.
Если значения NULL появляются в агрегатных функциях, таких как SUM, AVG, MAX, MIN, STDEV, STDEVP, VAR, VARP или COUNT, то при установке значения ON формируется предупреждающее сообщение. При установке значения OFF предупреждения не формируются.
Если задано значение ON, то для инструкции, выполнение которой привело к ошибке деления на ноль или арифметического переполнения, будет выполнен откат и сформировано сообщение об ошибке. Если установлено значение OFF, то ошибки деления на ноль и арифметического переполнения приведут к возврату значений NULL. Ошибки деления на нуль и арифметического переполнения приводят к возврату значений NULL, если инструкции INSERT или UPDATE применяются к столбцу типа character, Unicode или binary и длина нового значения превышает максимальный размер для этого столбца. Если значение SET ANSI_WARNINGS установлено в ON, то выполнение инструкции INSERT или UPDATE прекращается в соответствии со стандартом ISO. Конечные пробелы игнорируются для символьных столбцов, а конечные значения NULL игнорируются для бинарных столбцов. Если указано значение 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" статьи Инструкции 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.database .
Внимание
Параметр ANSI_WARNINGS должен быть установлен в ON для выполнения распределенных запросов.
Клиенты, такие как драйвер ODBC собственного клиента SQL Server, поставщик OLE DB собственного клиента SQL Server для SQL Server, а драйвер Microsoft JDBC для SQL Server автоматически устанавливает ANSI_WARNINGS значение ON с флагом подключения. Его можно настроить в источниках данных ODBC, в атрибутах соединения ODBC или в приложении перед сеансом связи. Для соединений от приложений DB-Library значение по умолчанию для параметра SET ANSI_WARNINGS равно значению OFF. Дополнительные сведения см. в разделе LOGIN7 в спецификациях протокола потока табличных данных (TDS).
Если параметр ANSI_DEFAULTS установлен в значение ON, параметр SET 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;
Разрешения
Необходимо быть членом роли public.
Примеры
Следующий пример демонстрирует три рассмотренные ситуации со значениями ON и OFF для параметра SET ANSI_WARNINGS.
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;