SET ANSI_WARNINGS (Transact-SQL)

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW) Endpoint di analisi SQL in Microsoft Fabric Warehouse in Microsoft Fabric

Specifica il funzionamento standard ISO in varie condizioni di errore.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

Sintassi per SQL Server, pool SQL serverless in Azure Synapse Analytics, Microsoft Fabric

SET ANSI_WARNINGS { ON | OFF }

Sintassi per Azure Synapse Analytics e piattaforma di strumenti analitici (PDW)

SET ANSI_WARNINGS ON

Osservazioni:

L'opzione SET ANSI_WARNINGS risulta rilevante nelle condizioni seguenti:

  • Quando è impostata su ON, se le funzioni di aggregazione quali SUM, AVG, MAX, MIN, STDEV, STDEVP, VAR, VARP o COUNT includono valori Null, viene generato un messaggio di avviso. Quando è impostata su OFF, non viene generato alcun messaggio di avviso.

  • Quando è impostata su ON, in seguito a errori di divisione per zero e di overflow aritmetico viene eseguito il rollback dell'istruzione e viene visualizzato un messaggio di errore. Quando è impostata su OFF, in seguito a errori di divisione per zero e di overflow aritmetico vengono restituiti valori Null. Si verifica un errore di divisione per zero o di overflow aritmetico se viene eseguita un'operazione INSERT o UPDATE in una colonna di tipo character, Unicode o binary in cui la lunghezza di un nuovo valore supera le dimensioni massime della colonna. Se l'opzione SET ANSI_WARNINGS è impostata su ON, l'istruzione INSERT o UPDATE viene annullata, come specificato dallo standard ISO. Nelle colonne di tipo carattere vengono ignorati gli spazi finali, mentre nelle colonne binarie vengono ignorati i valori Null finali. Quando l'opzione è impostata su OFF, i dati vengono troncati in base alle dimensioni della colonna e l'istruzione ha esito positivo.

Nota

Se durante una conversione da o verso il tipo di dati binary o varbinary si verifica un troncamento, non viene visualizzato alcun avviso o errore, indipendentemente dalle opzioni SET.

Nota

ANSI_WARNINGS non viene applicata quando vengono trasmessi parametri in una stored procedure o in una funzione definita dall'utente oppure in caso di dichiarazione e impostazione delle variabili in un'istruzione batch. Se, ad esempio, la variabile viene definita come char(3) e quindi impostata su un valore maggiore di tre caratteri, i dati verranno troncati alla dimensione definita e l'istruzione INSERT o UPDATE avrà esito positivo.

È possibile usare l'opzione opzioni utente di sp_configure per impostare l'impostazione predefinita per ANSI_WARNINGS per tutte le connessioni al server. Per altre informazioni, vedere sp_configure (Transact-SQL).

È necessario che l'opzione ANSI_WARNINGS sia impostata su ON durante la creazione o la modifica di indici in colonne calcolate o viste indicizzate. Se l'opzione SET ANSI_WARNINGS è impostata su OFF, le istruzioni CREATE, UPDATE, INSERT e DELETE eseguite su tabelle che includono indici in colonne calcolate e viste indicizzate hanno esito negativo. Per altre informazioni sulle impostazioni dell'opzione SET necessarie per viste indicizzate e indici nelle colonne calcolate, vedere "Considerazioni sull'uso delle istruzioni SET" nell'argomento Istruzioni SET (Transact-SQL).

SQL Server include l'opzione di database ANSI_WARNINGS. che equivale a SET ANSI_WARNINGS. Quando l'opzione SET ANSI_WARNINGS è impostata su ON, vengono generati errori o avvisi di divisione per zero, di stringa troppo estesa per la colonna di database e altri errori simili. Quando l'opzione SET ANSI_WARNINGS è impostata su OFF, questi errori e avvisi non vengono generati. Il valore predefinito nel model database per SET ANSI_WARNINGS è OFF. Se omessa, verrà applicata l'impostazione di ANSI_WARNINGS. Se l'opzione SET ANSI_WARNINGS è impostata su OFF, SQL Server usa il valore della colonna is_ansi_warnings_on nella vista del catalogo sys.databases.

Importante

È necessario impostare l'opzione ANSI_WARNINGS su ON per l'esecuzione di query distribuite.

I client, come il driver ODBC di SQL Server Native Client, il provider OLE DB di SQL Server Native Client per SQL Server e il driver Microsoft JDBC per SQL Server impostano automaticamente l'opzione ANSI_WARNINGS su ON con un flag di connessione. Può essere configurata nelle origini dati ODBC o negli attributi di connessione ODBC impostati nell'applicazione prima della connessione. L'impostazione predefinita dell'opzione SET ANSI_WARNINGS è OFF per le connessioni dalle applicazioni DB-Library. Per ulteriori informazioni, vedere LOGIN7 nelle specifiche del protocollo TDS (Tabular Data Stream).

Quando l'opzione ANSI_DEFAULTS è impostata su ON, l'opzione ANSI_WARNINGS è abilitata.

L'impostazione di ANSI_WARNINGS viene definita in fase di esecuzione, non in fase di analisi. Analogamente a tutte le istruzioni SET, SET ANSI_WARNINGS influisce sulla sessione corrente.

Se l'opzione SET ARITHABORT o SET ARITHIGNORE è impostata su OFF e l'opzione SET ANSI_WARNINGS è impostata su ON, SQL Server restituisce comunque un messaggio di errore quando si verificano errori di divisione per zero o di overflow.

Per visualizzare l'impostazione corrente per questa impostazione, eseguire la query riportata di seguito.

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

Autorizzazioni

È richiesta l'appartenenza al ruolo public .

Esempi

Nell'esempio seguente vengono illustrate le tre situazioni sopra descritte con l'opzione SET ANSI_WARNINGS impostata su ON e su 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  

Impostare ora ANSI_WARNINGS su ON e testare.

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  

Impostare ora ANSI_WARNINGS su OFF e testare.

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;