SET ANSI_WARNINGS (Transact-SQL)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsPiattaforma di analisi (PDW)Endpoint di analisi SQL in Microsoft FabricMagazzino in Microsoft FabricDatabase SQL 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:

SET ANSI_WARNINGS Influisce sulle seguenti condizioni:

  • 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. Il comportamento in cui un errore di divisione per zero o di overflow aritmetico causa la restituzione di valori nulli si verifica se un INSERT o UPDATE viene provato su un carattere, Unicode o colonna binaria in cui la lunghezza di un nuovo valore supera la dimensione massima della colonna. Se SETSET ANSI_WARNINGS è ON, il INSERT or UPDATE viene annullato 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

Quando si verifica una troncatura in qualsiasi conversione da o verso dati binari o varbinari , non viene emessa alcuna ammonizione o errore, indipendentemente dalle SET opzioni.

Nota

ANSI_WARNINGS non viene rispettato quando si passano parametri in una stored procedure, in una funzione definita dall'utente, o quando si dichiarano e si impostano 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 alle dimensioni definite e l'istruzione INSERT o UPDATE avrà esito positivo.

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

ANSI_WARNINGS deve essere ATTIVO quando si creano o manipolino indici su colonne calcolate o viste indicizzate. Se SETSET ANSI_WARNINGS è OFF, CREATE, UPDATE, INSERT, e DELETE le istruzioni su tabelle con indici su colonne calcolate o viste indicizzate falliranno. Per maggiori informazioni sulle impostazioni di opzione richieste SET con viste indicizzate e indici su colonne calcolate, vedi "Considerazioni quando usi le SET Dichiarazioni" in SET Istruzioni (Transact-SQL).

SQL Server include l'opzione ANSI_WARNINGS database. che equivale a SET ANSI_WARNINGS. Quando SET ANSI_WARNINGS è ON, errori o avvisi vengono generati in divisione per zero, stringa troppo grande per colonna del database e altri errori simili. Quando SET ANSI_WARNINGS è SPENTO, questi errori e avvisi non vengono mostrati. Il valore predefinito nel model database per SET ANSI_WARNINGS è OFF. Se non specificato, vale l'impostazione di ANSI_WARNINGS . Se SET ANSI_WARNINGS è OFF, SQL Server utilizza il valore della colonna is_ansi_warnings_on nella vista catalogo sys.databases.

Importante

ANSI_WARNINGS deve essere impostato su ON per l'esecuzione di query distribuite.

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 JDBC di Microsoft per SQL Server vengono automaticamente impostati 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. Il valore predefinito per SET ANSI_WARNINGS OFF per le connessioni da DB-Library applicazioni. Per ulteriori informazioni, vedere LOGIN7 nelle specifiche del protocollo TDS (Tabular Data Stream).

Quando ANSI_DEFAULTS è ATTIVATO, ANSI_WARNINGS è abilitato.

L'impostazione di è definita in fase di ANSI_WARNINGS esecuzione o in fase di esecuzione e non in fase di analisi. Come tutte SET le Dichiarazioni, SET ANSI_WARNINGS influisce sulla sessione corrente.

Se uno dei SET ARITHABORT due o SETSET ARITHIGNORE è OFF ed SETSET ANSI_WARNINGS è ON, SQL Server restituisce comunque un messaggio di errore quando si incontrano errori di divisione per zero o 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

L'esempio seguente mostra le tre situazioni menzionate in precedenza, con il SET ANSI_WARNINGS to ON e il 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  

Ora imposta ANSI_WARNINGS su ON e testa.

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  

Ora imposta ANSI_WARNINGS OFF e testa.

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;