SET ANSI_WARNINGS (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsPDW (Analytics Platform System)Ponto de extremidade de SQL no Microsoft FabricWarehouse no Microsoft Fabric

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

Convenções de sintaxe de Transact-SQL

Sintaxe

Sintaxe para SQL Server, Pool de SQL sem servidor no Azure Synapse Analytics, Microsoft Fabric

SET ANSI_WARNINGS { ON | OFF }

Sintaxe para Azure Synapse Analytics e PDW (Analytics Platform System)

SET ANSI_WARNINGS ON

Observação

Para exibir a sintaxe do Transact-SQL para o SQL Server 2014 (12.x) e versões anteriores, confira a Documentação das versões anteriores.

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 ou divisão por zero faz valores nulos serem retornados ocorrerá se houver uma tentativa de INSERT ou UPDATE em uma coluna character, Unicode ou binary na qual a extensão do novo valor exceda o tamanho máximo da coluna. Se SET ANSI_WARNINGS está ON, 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.

Observação

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

Observação

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, em seguida, configurada com um valor maior que três caracteres, os dados serão truncados até o tamanho definido e a instrução INSERT ou UPDATE terá êxito.

Você pode usar a opção de opções do usuário de sp_configure para definir a configuração padrão para ANSI_WARNINGS para todas as conexões com o servidor. Para obter mais informações, confira sp_configure (Transact-SQL).

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, confira "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 model banco de dados 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 do catálogo sys.databases.

Importante

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

Clientes, como o SQL Server driver ODBC do Native Client, o provedor de OLE DB do SQL Server Native Client para SQL Server e o Microsoft JDBC Driver for SQL Server automaticamente definem ANSI_WARNINGS como ON com um sinalizador de conexão. 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. Para obter mais informações, confira LOGIN7 nas especificações do protocolo TDS.

Quando ANSI_DEFAULTS é ON, ANSI_WARNINGS está habilitado.

A configuração de ANSI_WARNINGS é definida no momento da execução, e não no momento da análise. Como todas as instruções SET, SET ANSI_WARNINGS afeta a sessão atual.

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 pública .

Exemplos

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

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  

Agora defina ANSI_WARNINGS como ON e teste.

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  

Agora defina ANSI_WARNINGS como OFF e teste.

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;