SET ANSI_WARNINGS (Transact-SQL)

Especifica o comportamento padrão ISO para várias condições de erro.

Aplica-se a: SQL Server (SQL Server 2008 até a versão atual), Banco de dados SQL do Windows Azure (versão inicial até a versão atual).

Ícone de vínculo de tópico Convenções da sintaxe Transact-SQL

Sintaxe

SET ANSI_WARNINGS { ON | OFF }

Comentários

SET ANSI_WARNINGS afeta as seguintes condições:

  • Quando definida como ON, se forem exibidos valores nulos em funções de agregação, como SUM, AVG, MAX, MIN, STDEV, STDEVP, VAR, VARP ou COUNT, será gerada uma mensagem de aviso. Quando definido como OFF, nenhum aviso é emitido.

  • Quando definida como ON, os erros de estouro aritmético e de divisão por zero fazem a instrução ser retornada e uma mensagem de erro é gerada. Quando definida como OFF, os erros de estouro aritmético e de divisão por zero fazem com que valores nulos sejam retornados. O comportamento em que um erro de estouro aritmético e de divisão por zero faz como que valores nulos sejam retornados ocorre se houver uma tentativa de operação INSERT ou UPDATE em uma coluna character, Unicode ou binary que tenha novo valor com comprimento maior que o tamanho máximo da coluna. Quando SET ANSI_WARNINGS estiver como ON, a operação INSERT ou UPDATE é cancelada, como especificado pelo padrão ISO. Espaços em branco à direita são ignorados em colunas de caracteres e valores nulos à direita são ignorados em colunas binárias. Quando OFF, os dados são truncados para o tamanho da coluna e a instrução obtém êxito.

    Dica

    Quando o truncamento ocorre em qualquer conversão para ou de dados binary ou varbinary, nenhum aviso ou erro é emitido, independentemente das opções SET.

    Dica

    O ANSI_WARNINGS não é cumprido quando os parâmetros passam no procedimento armazenado, em uma função definida pelo usuário ou quando declaram ou definem variáveis em uma instrução de lote.Por exemplo, se a variável for definida como char(3) e configurada para um valor maior do que três caracteres, os dados ficarão truncados para o tamanho definido e a instrução INSERT ou UPDATE terá êxito.

É possível usar a opção user options de sp_configure para definir a configuração padrão para ANSI_WARNINGS em todas as conexões com o servidor. Para obter mais informações, consulte sp_configure (Transact-SQL).

SET ANSI_WARNINGS também deve ser ON quando você estiver criando ou manipulando índices em colunas computadas ou exibições indexadas. Se SET ANSI_WARNINGS for OFF, as instruções CREATE, UPDATE, INSERT e DELETE nas tabelas com índices em colunas computadas ou exibições indexadas falharão. Para obter mais informações sobre as configurações da opção SET com exibições indexadas e índices em colunas computadas, consulte "Considerações sobre o uso das instruções SET" em Instruções SET (Transact-SQL).

O SQL Server inclui a opção de banco de dados ANSI_WARNINGS. Ela é equivalente a SET ANSI_WARNINGS. Quando SET ANSI_WARNINGS é ON, são gerados erros ou avisos em erros de divisão por zero, erros de cadeia de caracteres muito longa para a coluna de banco de dados e outros erros semelhantes. Quando SET ANSI_WARNINGS é OFF, esses erros e avisos não estão gerados. O valor padrão no banco de dados model para SET ANSI_WARNINGS é OFF. Se não for especificado, a configuração ANSI_WARNINGS será aplicada. Se SET ANSI_WARNINGS for OFF, o SQL Server usará o valor da coluna is_ansi_warnings_on na exibição de catálogo sys.databases.

SET ANSI_WARNINGS deve ser definido como ON para executar consultas distribuídas.

O driver SQL Server Native Client ODBC e o SQL Server Native Client OLE DB Provider for SQL Server definem automaticamente ANSI_WARNINGS como ON ao conectar. Isso pode ser configurado em fontes de dados ODBC, em atributos de conexão ODBC, definidas no aplicativo antes de conectar. O padrão para SET ANSI_WARNINGS é OFF para conexões de aplicativos DB-Library.

Quando SET ANSI_DEFAULTS é ON, SET ANSI_WARNINGS está habilitado.

A configuração de SET ANSI_WARNINGS é definida no momento da execução e não no momento da análise.

Se SET ARITHABORT ou SET ARITHIGNORE estiver definida como OFF e SET ANSI_WARNINGS como ON, o SQL Server ainda retornará uma mensagem de erro quando encontrar erros de divisão por zero ou de estouro.

Para exibir a configuração atual dessa configuração, execute a consulta a seguir.

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

Permissões

Requer associação à função public.

Exemplos

O exemplo a seguir demonstra as três situações previamente mencionadas, com SET ANSI_WARNINGS definido como ON e OFF.

USE AdventureWorks2012;
GO

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
  
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

Consulte também

Referência

INSERT (Transact-SQL)

SELECT (Transact-SQL)

Instruções SET (Transact-SQL)

SET ANSI_DEFAULTS (Transact-SQL)

SESSIONPROPERTY (Transact-SQL)