SET ANSI_WARNINGS (Transact-SQL)
Especifica el comportamiento estándar de ISO para diversas condiciones de error.
Sintaxis
SET ANSI_WARNINGS { ON | OFF }
Notas
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 la a variable se define como char(3) y después se establece en un valor de más de tres caracteres, los datos se truncan con el tamaño definido y la instrucción INSERT o UPDATE se ejecuta correctamente.
Se puede utilizar la opción user options de sp_configure para establecer el valor predeterminado de ANSI_WARNINGS en todas las conexiones al 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 o en las propiedades de conexión OLE DB establecidas 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
Debe pertenecer a la función public.
Ejemplos
En este ejemplo se muestran las tres situaciones mencionadas anteriormente con SET ANSI_WARNINGS en ON y en OFF.
USE AdventureWorks;
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