Excepción con ‘ARITHABORT’ al insertar datos en una base de datos SQL Server

Este error me pasó el otro día en una aplicación que estoy desarrollando para una empresa de logística y me pareció lo suficientemente interesante como para reseñarlo aquí.


El caso es que tienes un código de actualización INSERT normal y corriente de acceso a datos, escrito directamente con código ADO.NET, a través de un procedimiento almacenado o incluso mediante el uso de un TableAdapter de un DataSet tipado (por debajo es ADO.NET normal). Cuando vas a actualziar cualquier registro, de repente, te salta el siguiente error:



INSERT failed because the following SET options have incorrect settings: ‘ARITHABORT’


Bueno. Esta excepción es el resultado resultado directo de una particularidad de SQL Server. El caso es que si tenemos una tabla que está referenciada dentro de cualquier vista de la base de datos que sea una vista indexada, no es posible introducir nuevos registros en la tabla de la manera normal y directa.


Lo típico que pasa (y de hecho fué lo que me pasó a mi): Creas varias tablas, las usas, trabajas con ellas por código etc… y todo funciona a la perfección. Cuando la aplicación ya está bastante avanzada te dices: “Vale, voy a pasar el analizador de consultas a ver qué me sugiere para mejorar el rendimiento de lo que se hace en la base de datos” (en este aplicación en concreto hay consultas bastante complejas). Pasas el analizador y te sugiere algún que otro índice, estadísticas y, a veces, también alguna vista. Aceptas las sugerencias y dejas que se hagan los cambios. Pruebas de nuevo la aplicación y ¡hop!, el maldito error reseñado arriba.


Normalmente es porque se hac creado de manera consicente o inconsciente una vista indexada que referencia a alguans tablas que ahora ya no se pueden actualziar directamente.


Una solución es evitar el uso de este tipo de vistas (la mayor parte de las veces puedes vivir sin ellas).


La solución real al problema consiste en establecer la opción:



SET ARITHABORT ON


para que se ejecute dentro del mismo conjunto de instrucciones enviadas a la base de datos (a través de la misma conexión y antes de nada). Esto permite que el INSERT en la tabla problemática tenga éxito a pesar de la vista indexada.


El códig ADO.NET que debes usar para conseguirlo es, nada más abrir la conexión  y antes de hacer la inserción el siguiente:



miConn.Execute “SET ARITHABORT ON”


Yo en mi aplicación, como no soy un experto en bases de datos y ni siquiera me gustan mucho, opté por cargarme la vista indexada 😉


Espero que esto arroje luz y le ahorre tiempo a más de uno.

Sin categoría

14 thoughts on “Excepción con ‘ARITHABORT’ al insertar datos en una base de datos SQL Server

  1. supongo que se refiere a error Aritmetico y que se aborte ( por el nombre )

    Referencia MSDN en castellano

    http://msdn2.microsoft.com/es-es/library/ms190306.aspx

    CASO 1
    Cancela una consulta cuando se produce un error de desbordamiento o división por cero durante su ejecución.

    Si al evaluar una expresión con SET ARITHABORT en OFF, una instrucción INSERT, DELETE o UPDATE encuentra un error aritmético, desbordamiento, división por cero o error de dominio, SQL Server inserta o actualiza un valor NULL. Si la columna de destino no acepta valores NULL, no se puede efectuar la acción de inserción o actualización y el usuario recibe un error.

    CASO 2

    SET ARITHABORT también debe ser ON al crear o cambiar índices en columnas calculadas o vistas indizadas.

    CASO 3

    Si SET ARITHABORT es OFF y se produce un error de anulación durante la evaluación de una condición booleana de una instrucción IF, se ejecutará la rama FALSE.

  2. Trabajo tambien en una empresa de logistica privada en Argentina el mismo problema. Alguien en el mundo tuvo el mismo inconveniente antes lo soluciono y lo compartio. GRACIAS.-

  3. Mi caso fue de un indice que generé en una tabla… al momento de insertar o modificar se caia … claramente por que no acepta ingresar un valor nulo o no consistente .. elimine.. el indice NO problem todo normal.. creo que la otra solución pudo ser agregar un valor en el campo del indice …

    salu2

  4. GRACIAS POR ESTOS COMENTARIOS

    AQUI PASO EXACTAMENTE ESTE CASO SE CORRIO EL OPTIMIZADOR Y PASO EL MALDITO ERROR:
    INSERT failed because the following SET options have incorrect settings: ‘ARITHABORT’

    Nuestra solucion fue borrar la vista indexada!
    y funciono perfectamente.

    GRACIAS

  5. El caso mio es al ejecutar el siguiente query
    IF OBJECT_ID(‘dbo.table’, ‘U’) IS NOT NULL
    DROP TABLE dbo.table;
    CREATE TABLE [dbo].[table](
    [COD_INSTITUCION] [int] NULL
    )
    lo solucione estableciendo SET ARITHABORT ON
    me pordrian decir si es correcto ?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *