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;