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 SETSET 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 SET opções.

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 INSERT instrução or UPDATE terá êxito.

Podes usar a opção de opções de utilizador para sp_configure definir a definição padrão para ANSI_WARNINGS 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 SETSET ANSI_WARNINGS for OFF, CREATE, UPDATE, INSERT, e DELETE instruções em tabelas com índices em colunas computadas ou vistas indexadas falharão. Para mais informações sobre as definições de opções obrigatórias SET com vistas e índices indexados em colunas calculadas, consulte "Considerações Quando Usa as SET Sentenças" em SET Instruções (Transact-SQL).

O SQL Server inclui a ANSI_WARNINGS opção de base de dados. Isto equivale a SET ANSI_WARNINGS. Quando SET ANSI_WARNINGS está LIGADO, aparecem erros ou avisos em divisão por zero, string demasiado grande para uma coluna da base de dados, e outros erros semelhantes. Quando SET ANSI_WARNINGS 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, SQL Server usa o valor da coluna is_ansi_warnings_on na vista de catálogo sys.databases.

Importante

ANSI_WARNINGS deve ser definido como ON para executar 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 da Microsoft para SQL Server são automaticamente definidos ANSI_WARNINGS como ON com uma flag 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á ATIVADO, ANSI_WARNINGS está ativado.

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 Declarações, 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 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 anteriormente mencionadas, 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 defina ANSI_WARNINGS o modo 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;