SET ANSI_WARNINGS (Transact-SQL)

Применимо к:SQL ServerБаза данных Azure SQLУправляемый экземпляр Azure SQLAzure Synapse AnalyticsСистема платформы аналитики (PDW)Конечная точка SQL аналитики в Microsoft FabricХранилище в Microsoft FabricБаза данных SQL в 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. Поведение, при котором ошибка деления на ноль или арифметическое переполнение приводит к возврату нулевых значений, возникает, если INSERT на символе, Юникоде или бинарном столбце попробовать или UPDATE в котором длина нового значения превышает максимальный размер столбца. Если SETSET ANSI_WARNINGS ВКЛЮЧЕНО, или INSERTUPDATE отменяется в соответствии со стандартом ISO. Конечные пробелы игнорируются для символьных столбцов, а конечные значения NULL игнорируются для бинарных столбцов. Если указано значение OFF, то данные усекаются до размера столбца, и инструкция успешно завершается.

Примечание.

Когда происходит усечение при любом преобразовании в двоичные или варбинарные данные, предупреждение или ошибка не выдаётся, независимо от SET вариантов.

Примечание.

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

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

ANSI_WARNINGS Он должен быть ВКЛЮЧЁН, когда вы создаёте или управляете индексами на вычисленных столбцах или индексированных представлениях. Если SETSET ANSI_WARNINGS OFF, CREATE, UPDATE, INSERT, и DELETE операторы в таблицах с индексами в вычисленных столбцах или индексированных представлениях не будут выполнены. Для получения дополнительной информации о необходимых SET настройках опций с индексированными видами и индексами на вычисленных столбцах см. раздел «Соображения при использовании SET операторов» в SET разделе Операторы (Transact-SQL).

SQL Server включает ANSI_WARNINGS опцию базы данных. Это равносильно SET ANSI_WARNINGS. Когда SET ANSI_WARNINGS ВКЛЮЧЕНО, ошибки или предупреждения появляются при делении на ноль, строке слишком большой для столбца базы данных и других подобных ошибках. Когда SET ANSI_WARNINGS ВЫКЛЮЧЕНО, эти ошибки и предупреждения не возникают. Значение по умолчанию в model базе данных для SET ANSI_WARNINGS — OFF. Если не указано, применяется настройка .ANSI_WARNINGS Если SET ANSI_WARNINGS OFF, SQL Server использует значение столбца is_ansi_warnings_on в каталоге sys.databases.

Внимание

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

Клиенты, такие как драйвер SQL Server Native Client ODBC, SQL Server Native Client OLE DB Provider для SQL Server и драйвер Microsoft JDBC для SQL Server, автоматически устанавливаются ANSI_WARNINGS в режим ON с флагом соединения. Его можно настроить в источниках данных ODBC, в атрибутах соединения ODBC или в приложении перед сеансом связи. По умолчанию для SET ANSI_WARNINGS подключений из DB-Library приложений используется ВЫКЛЮЧЕНО. Дополнительные сведения см. в разделе LOGIN7 в спецификациях протокола потока табличных данных (TDS).

При ANSI_DEFAULTS включении включено значение ON ANSI_WARNINGS .

Параметр ANSI_WARNINGS определяется во время выполнения или выполнения, а не во время синтаксического анализа. Как и все SET заявления, SET ANSI_WARNINGS влияет на текущую сессию.

Если один SET ARITHABORT из вариантов ВЫКЛЮЧЕН SETSET ARITHIGNORE и SETSET ANSI_WARNINGS включён, SQL Server всё равно возвращает сообщение об ошибке при сталкивании с делением на ноль или ошибками переполнения.

Чтобы просмотреть текущее значение для этого параметра, выполните следующий запрос.

DECLARE @ANSI_WARN VARCHAR(3) = 'OFF';  
IF ( (8 & @@OPTIONS) = 8 ) SET @ANSI_WARN = 'ON';  
SELECT @ANSI_WARN AS ANSI_WARNINGS;  

Разрешения

Необходимо быть членом роли public.

Примеры

Следующий пример демонстрирует три вышеупомянутые ситуации с 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 режим ВКЛ и протестируйте.

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;