SET ANSI_WARNINGS (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)Ponto de extremidade de análise de SQL no Microsoft FabricDepósito no Microsoft FabricBanco de dados SQL 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

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 divisão por zero ou de transbordamento aritmético causa o retorno de valores nulos ocorre se um INSERT ou UPDATE for tentado em um caractere, Unicode ou coluna binária em que o comprimento de um novo valor excede o tamanho máximo da coluna. Se SETSET ANSI_WARNINGS estiver LIGADO, o INSERT ou UPDATE é cancelado conforme especificado pela norma 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 ocorre truncamento em qualquer conversão para ou de dados binários ou varbinários , nenhum aviso ou erro é emitido, independentemente das SET opções.

Observação

ANSI_WARNINGS não é respeitado ao passar parâmetros em um procedimento armazenado, função definida pelo usuário, ou ao declarar e definir variáveis em uma instrução batch. 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 de usuário para sp_configure definir a configuração padrão para ANSI_WARNINGS todas as conexões ao servidor. Para obter mais informações, confira sp_configure (Transact-SQL).

ANSI_WARNINGS deve estar LIGADO quando você está criando ou manipulando índices em colunas computadas ou visualizações indexadas. Se SETSET ANSI_WARNINGS for OFF, CREATE, UPDATE, INSERT, e DELETE instruções em tabelas com índices em colunas computadas ou visualizações indexadas falharão. Para mais informações sobre as configurações de opções obrigatórias SET com visualizações indexadas e índices em colunas computadas, veja "Considerações ao Usar as SET Sentenças" em SET Instruções (Transact-SQL).

O SQL Server inclui a ANSI_WARNINGS opção de banco de dados. Isso é equivalente a SET ANSI_WARNINGS. Quando SET ANSI_WARNINGS está LIGADO, erros ou avisos são gerados em divisão por zero, string grande demais para coluna de banco de dados e outros erros semelhantes. Quando SET ANSI_WARNINGS está DESLIGADO, esses erros e avisos não são acionados. O valor padrão no model banco de dados para SET ANSI_WARNINGS é DESLIGADO. Se não especificado, a configuração de ANSI_WARNINGS se aplica. Se SET ANSI_WARNINGS estiver DESLIGADO, SQL Server usa o valor da coluna is_ansi_warnings_on na visualização de catálogo sys.databases.

Importante

ANSI_WARNINGS deve ser definido como ON para a execução de consultas distribuídas.

Clientes, como o driver ODBC do SQL Server Native Client, o SQL Server Native Client OLE DB Provider for SQL Server e o driver JDBC do Microsoft para SQL Server são automaticamente definidos ANSI_WARNINGS como LIGADO com uma flag 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 é DESLIGADO para conexões de DB-Library aplicações. Para obter mais informações, confira LOGIN7 nas especificações do protocolo TDS.

Quando ANSI_DEFAULTS está ON, ANSI_WARNINGS está habilitado.

A configuração de é definida em tempo de execução ou execução e não em tempo de ANSI_WARNINGS análise. Como todas SET as Sentenças, SET ANSI_WARNINGS afeta a sessão atual.

Se qualquer um SET ARITHABORT dos ou SETSET ARITHIGNORE estiver DESLIGADO e SETSET ANSI_WARNINGS LIGADO, o SQL Server ainda retorna uma mensagem de erro ao encontrar erros de divisão por zero ou de overflow.

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 mencionadas anteriormente, com o SET ANSI_WARNINGS to ON e o 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 para LIGADO 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 configure ANSI_WARNINGS para DESLIGADO 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;