SET ANSI_WARNINGS (Transact-SQL)
Especifica el comportamiento estándar de ISO para diversas condiciones de error.
Sintaxis
SET ANSI_WARNINGS { ON | OFF }
Comentarios
SET ANSI_WARNINGS afecta a las condiciones siguientes:
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 por el cual una división por cero o un error de desbordamiento aritmético provocan que se devuelvan valores NULL se produce si se intentan ejecutar instrucciones INSERT o UPDATE en una columna de tipo character, Unicode o binary en la que la longitud del nuevo valor excede el tamaño máximo de la columna. Si SET ANSI_WARNINGS es ON, la operación INSERT o UPDATE se cancela, tal y como especifica el estándar 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 se produce un truncamiento en alguna conversión desde o hacia datos binary o varbinary, no se emite ningún error ni advertencia, independientemente de las opciones SET.
Nota
No se respeta ANSI_WARNINGS al pasar parámetros de un procedimiento almacenado, una función definida por el usuario o al declarar y establecer variables en una instrucción de lote. Por ejemplo, si se define una variable como char(3) y después se establece en un valor de más de tres caracteres, los datos se truncan hasta reducirse al tamaño definido y la instrucción INSERT o UPDATE se ejecuta correctamente.
Puede usar la opción user options de sp_configure para establecer la configuración predeterminada de ANSI_WARNINGS para todas las conexiones con el servidor. Para obtener más información, vea sp_configure (Transact-SQL) o Establecer las opciones de configuración del servidor.
SET ANSI_WARNINGS también debe ser ON al crear o manipular índices en columnas calculadas o vistas indizadas. Si SET ANSI_WARNINGS es OFF, las instrucciones CREATE, UPDATE, INSERT y DELETE provocarán errores en tablas con índices en columnas calculadas y vistas indizadas. Para obtener más información acerca de las configuraciones de las opciones SET requeridas con vistas indizadas e índices en columnas calculadas, vea el apartado relativo a las consideraciones al utilizar las instrucciones SET en SET (Transact-SQL).
SQL Server incluye la opción de base de datos ANSI_WARNINGS. Es equivalente a SET ANSI_WARNINGS. Cuando SET ANSI_WARNINGS es ON, se producen errores o advertencias si hay división por cero, cadenas demasiado largas para la columna correspondiente de la base de datos y otras situaciones similares. Cuando SET ANSI_WARNINGS es OFF, no se generan tales errores y advertencias. La opción predeterminada en la base de datos model para SET ANSI_WARNINGS es OFF. Si no se especifica, se aplica la opción de ANSI_WARNINGS. Si SET ANSI_WARNINGS es OFF, SQL Server utiliza el valor de la columna is_ansi_warnings_on de la vista de catálogo sys.databases. Para obtener más información, vea Configurar las opciones de la base de datos.
ANSI_WARNINGS debe establecerse en ON para ejecutar consultas distribuidas.
El controlador ODBC de SQL Server Native Client y el proveedor OLE DB de SQL Server Native Client para SQL Server establecen automáticamente ANSI_WARNINGS en ON al conectarse. 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 predeterminado de SET ANSI_WARNINGS es OFF en las conexiones desde aplicaciones DB-Library.
Cuando SET ANSI_DEFAULTS es ON, se habilita SET ANSI_WARNINGS.
La opción SET ANSI_WARNINGS se establece en tiempo de ejecución, no en tiempo de análisis.
Si SET ARITHABORT o SET ARITHIGNORE es OFF y SET ANSI_WARNINGS es ON, SQL Server devolverá un mensaje de error cuando haya errores de división por cero o desbordamiento.
Permisos
Requiere la pertenencia al rol public.
Ejemplos
En este ejemplo se muestran las tres situaciones mencionadas anteriormente con SET ANSI_WARNINGS en ON y en OFF.
USE AdventureWorks2008R2;
GO
CREATE TABLE T1 (
a INT,
b INT NULL,
c VARCHAR(20)
);
GO
SET NOCOUNT ON
INSERT INTO T1
VALUES (1, NULL, '');
INSERT INTO T1
VALUES (1, 0, '');
INSERT INTO T1
VALUES (2, 1, '');
INSERT INTO T1
VALUES (2, 2, '');
SET NOCOUNT OFF;
GO
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
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