SET ANSI_WARNINGS (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseInstancia administrada de Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Punto de conexión de SQL Analytics en Microsoft FabricAlmacén en Microsoft FabricBase de datos SQL en Microsoft Fabric

Especifica el comportamiento estándar de ISO para diversas condiciones de error.

Convenciones de sintaxis de Transact-SQL

Sintaxis

Sintaxis de SQL Server y un grupo de SQL sin servidor en Azure Synapse Analytics, Microsoft Fabric

SET ANSI_WARNINGS { ON | OFF }

Sintaxis para Azure Synapse Analytics y Sistema de la plataforma de análisis (PDW)

SET ANSI_WARNINGS ON

Comentarios

SET ANSI_WARNINGS afecta las siguientes condiciones:

  • Si es ON y aparecen valores NULL en funciones de agregado, como SUM, AVG, MAX, MIN, STDEV, STDEVP, VAR, VARP o COUNT, se genera un mensaje de advertencia. Si es OFF, no se genera ninguna advertencia.

  • Si es ON, los errores de división por cero y desbordamiento aritmético hacen que la instrucción se revierta y que se genere un mensaje de error. Si es OFF, los errores de división por cero y de desbordamiento aritmético hacen que se devuelvan valores NULL. El comportamiento en el que un error de división por cero o de desbordamiento aritmético provoca que se devuelvan valores nulos ocurre si se prueba un INSERT o UPDATE en un carácter, Unicode o columna binaria en la que la longitud de un nuevo valor supera el tamaño máximo de la columna. Si SETSET ANSI_WARNINGS está ACTIVADO, el INSERT o UPDATE se cancela según lo especificado por la norma ISO. No se tienen en cuenta los espacios en blanco a la derecha en las columnas de carácter ni los valores NULL a la derecha en las columnas binarias. Cuando es OFF, los datos se truncan para ajustarlos al tamaño de la columna y la instrucción se ejecuta correctamente.

Nota

Cuando ocurre truncamiento en cualquier conversión hacia o desde datos binarios o varbinarios , no se emite ningún aviso ni error, independientemente de las SET opciones.

Nota

ANSI_WARNINGS no se respeta al pasar parámetros en un procedimiento almacenado, una función definida por el usuario, ni al declarar y establecer variables en una instrucción por lote. Por ejemplo, si una variable se define como char(3) y después se establece en un valor de más de tres caracteres, los datos se truncan hasta el tamaño definido y la instrucción INSERT o UPDATE se ejecuta correctamente.

Puedes usar la opción de opciones de usuario para sp_configure configurar la configuración predeterminada para ANSI_WARNINGS todas las conexiones al servidor. Para obtener más información, vea sp_configure (Transact-SQL).

ANSI_WARNINGS debe estar ACTIVADO cuando creas o manipulas índices en columnas computadas o vistas indexadas. Si SETSET ANSI_WARNINGS está OFF, CREATE, UPDATE, INSERT, y DELETE las sentencias en tablas con índices en columnas calculadas o vistas indexadas fallarán. Para más información sobre la configuración de opciones requerida SET con vistas y índices indexados en columnas calculadas, consulte "Consideraciones al usar las SET sentencias" en SET Sentencias (Transact-SQL).

SQL Server incluye la ANSI_WARNINGS opción de base de datos. Es equivalente a SET ANSI_WARNINGS. Cuando SET ANSI_WARNINGS está activado, aparecen errores o advertencias en división por cero, cadena demasiado grande para una columna de base de datos y otros errores similares. Cuando SET ANSI_WARNINGS está APAGADO, estos errores y advertencias no se activan. El valor por defecto en la model base de datos para SET ANSI_WARNINGS es OFF. Si no se especifica, se aplica la configuración de ANSI_WARNINGS . Si SET ANSI_WARNINGS está OFF, SQL Server utiliza el valor de la columna is_ansi_warnings_on en la vista de catálogo de sys.databases.

Importante

ANSI_WARNINGS debe establecerse en ON para ejecutar consultas distribuidas.

Clientes, como el controlador ODBC SQL Server Native Client, el proveedor OLE DB SQL Server Native Client para SQL Server y el controlador JDBC Microsoft para SQL Server se configuran ANSI_WARNINGS automáticamente en ON con una bandera de conexión. Esta opción se puede configurar en los orígenes de datos ODBC, en los atributos de conexión de ODBC, establecidos en la aplicación antes de conectar. El valor por defecto para SET ANSI_WARNINGS OFF para conexiones de DB-Library aplicaciones. Para más información, vea LOGIN7 en las especificaciones del protocolo de flujo TDS.

Cuando ANSI_DEFAULTS está activado, ANSI_WARNINGS está habilitado.

La configuración de se define en tiempo de ANSI_WARNINGS ejecución o ejecución y no en tiempo de análisis. Como todas SET las sentencias, SET ANSI_WARNINGS afecta a la sesión actual.

Si uno de los SET ARITHABORT dos SETSET ARITHIGNORE está OFF y SETSET ANSI_WARNINGS ON (ACTIVADO), SQL Server sigue devolviendo un mensaje de error al encontrar errores de división por cero o de desbordamiento.

Para ver la configuración actual de este valor, ejecute la consulta siguiente.

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

Permisos

Debe pertenecer al rol public .

Ejemplos

El siguiente ejemplo muestra las tres situaciones mencionadas anteriormente, con el SET ANSI_WARNINGS to ON y el 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  

Ahora pon ANSI_WARNINGS en ON y prueba.

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  

Ahora pon ANSI_WARNINGS en OFF y prueba.

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;