Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к:SQL Server
База данных Azure SQL
Управляемый экземпляр Azure SQL
Azure 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;