Partilhar via


SET ANSI_WARNINGS (Transact-SQL)

Aplica-se a:SQL ServerBase de Dados SQL do AzureInstância Gerida do Azure SQLAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Ponto de Extremidade de Análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de Dados SQL no Microsoft Fabric

Especifica o comportamento da norma ISO para várias condições de erro.

Transact-SQL convenções de sintaxe

Sintaxe

Syntax for SQL Server, server less SQL pool in Azure Synapse Analytics, Microsoft Fabric

SET ANSI_WARNINGS { ON | OFF }

Syntax for Azure Synapse Analytics and Analytics Platform System (PDW)

SET ANSI_WARNINGS ON

Observações

SET ANSI_WARNINGS afeta as seguintes condições:

  • Quando definido como ON, se os valores nulos aparecerem em funções agregadas, como SUM, AVG, MAX, MIN, STDEV, STDEVP, VAR, VARP ou COUNT, é gerada uma mensagem de aviso. Quando está definido para DESLIGADO, não é emitido qualquer aviso.

  • Quando definido para ON, os erros de divisão por zero e de excesso aritmético fazem com que a instrução seja revertida e seja gerada uma mensagem de erro. Quando definido como OFF, os erros de divisão por zero e de overflow aritmético fazem com que os valores nulos sejam devolvidos. O comportamento em que um erro de divisão por zero ou de excesso aritmético faz com que valores nulos sejam devolvidos ocorre se um INSERT ou UPDATE for tentado num carácter, Unicode ou coluna binária em que o comprimento de um novo valor excede o tamanho máximo da coluna. Se o SET ANSI_WARNINGS estiver LIGADO, o INSERT ou UPDATE é cancelado conforme especificado pela norma ISO. Os blanks finais são ignorados para colunas de caracteres e os nulos finais são ignorados para colunas binárias. Quando DESLIGADO, os dados são truncados para o tamanho da coluna e a instrução tem sucesso.

Observação

Quando ocorre truncamento em qualquer conversão para ou a partir de dados binários ou varbinários , não é emitido qualquer aviso ou erro, independentemente das opções SET.

Observação

ANSI_WARNINGS não é respeitado ao passar parâmetros num procedimento armazenado, numa função definida pelo utilizador, ou ao declarar e definir variáveis numa instrução batch. Por exemplo, se uma variável for definida como char(3) e, em seguida, definida como um valor maior que três caracteres, os dados serão truncados para o tamanho definido e a instrução INSERT ou UPDATE será bem-sucedida.

Podes usar a opção de opções de utilizador para sp_configure definir a definição padrão de ANSI_WARNINGS para todas as ligações ao servidor. Para mais informações, consulte sp_configure (Transact-SQL).

ANSI_WARNINGS deve estar LIGADO quando está a criar ou manipular índices em colunas computadas ou vistas indexadas. Se o SET ANSI_WARNINGS estiver desligado, as instruções create, update, insert e DELETE em tabelas com índices em colunas computadas ou vistas indexadas falharão. Para mais informações sobre as definições obrigatórias de opções SET com vistas e índices indexados em colunas computadas, consulte "Considerações Quando Usa as Instruções SET" em Instruções SET (Transact-SQL).

O SQL Server inclui a opção ANSI_WARNINGS base de dados. Isto é equivalente ao SET ANSI_WARNINGS. Quando o ANSI_WARNINGS SET está LIGADO, aparecem erros ou avisos em divisão por zero, string demasiado grande para coluna da base de dados, e outros erros semelhantes. Quando o ANSI_WARNINGS SET está DESLIGADO, estes erros e avisos não são apresentados. O valor padrão na model base de dados para SET ANSI_WARNINGS é DESLIGADO. Se não especificado, aplica-se a configuração de ANSI_WARNINGS. Se SET ANSI_WARNINGS estiver DESLIGADO, o SQL Server utiliza o valor da coluna is_ansi_warnings_on na vista de catálogo sys.databases .

Importante

ANSI_WARNINGS deve estar definido como LIGADO para executar consultas distribuídas.

Clientes, como o driver ODBC SQL Server Native Client, o SQL Server Native Client OLE DB Provider para SQL Server e o Microsoft JDBC Driver para SQL Server definem automaticamente ANSI_WARNINGS para ON com uma bandeira de ligação. Isto pode ser configurado em fontes de dados ODBC, nos atributos de ligação ODBC, definido na aplicação antes da ligação. O padrão para SET ANSI_WARNINGS é DESLIGADO para ligações de DB-Library aplicações. Para informações adicionais, consulte LOGIN7 nas especificações do protocolo Tabular Data Stream (TDS).

Quando ANSI_DEFAULTS está LIGADO, ANSI_WARNINGS está ativado.

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

Se SET ARITHABORT ou SET ARITHIGNORE estiverem DESLIGADOS e SET ANSI_WARNINGS estiver LIGADO, o SQL Server ainda devolve uma mensagem de erro ao encontrar erros de divisão por zero ou de overflow.

Para visualizar a definição atual desta definição, execute a seguinte consulta.

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

Permissions

Requer adesão à função pública de .

Examples

O exemplo seguinte demonstra as três situações mencionadas anteriormente, com o SET ANSI_WARNINGS para 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 em 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 defina ANSI_WARNINGS para DESLIGAR 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;