Si recibe el error "Mensaje 8115, error de desbordamiento aritmético de nivel 16 al convertir IDENTIDAD a tipo de datos... ” en SQL Server, probablemente se deba a que está intentando insertar datos en una tabla cuando su IDENTITY
la columna ha alcanzado el límite de su tipo de datos.
Una IDENTITY
columna incrementa automáticamente el valor que se inserta con cada nueva fila. Si el valor que se inserta está fuera del rango del tipo de datos de la columna, se producirá el error anterior.
Ejemplo del error
Este es un ejemplo de código que genera el error:
INSERT INTO t1 VALUES ('Dog');
Resultado:
Msg 8115, Level 16, State 1, Line 1 Arithmetic overflow error converting IDENTITY to data type tinyint.
En este caso, mi IDENTITY
columna usa el tinyint
tipo de dato, que tiene un rango de 0 a 255. El error implica que la IDENTITY
columna está intentando insertar un valor superior a 255.
Esto suele ocurrir cuando ya hemos insertado 255 filas en la columna y ahora estamos tratando de insertar la fila 256.
Así es como se ve mi tabla cuando selecciono todas las filas donde IDENTITY
la columna es mayor que 250
:
SELECT * FROM t1
WHERE c1 > 250;
Resultado:
+------+------+ | c1 | c2 | |------+------| | 251 | Ant | | 252 | Cow | | 253 | Bat | | 254 | Duck | | 255 | Bull | +------+------+
En este caso, c1
es mi IDENTITY
columna (que resulta ser de tipo tinyint
). Podemos ver que IDENTITY
ha generado previamente 255
para la columna, por lo que el siguiente valor que intenta insertar es 256
(asumiendo un valor de incremento de 1
y sin inserciones fallidas anteriormente). Esto causará el error anterior, porque 256 está fuera del rango de un tinyint
.
El mismo problema puede ocurrir con tipos de datos de smallint
(valor máximo de 32.767) o int
(valor máximo de 2.147.483.647). También podría ocurrir con bigint
si insertó suficientes filas (más de 9,223,372,036,854,775,807).
Sin embargo, la IDENTITY
El valor no siempre coincide con el número de filas insertadas. Puede establecer un valor inicial al crear una IDENTITY
columna, y también puede establecer un valor de incremento. Por lo tanto, podría alcanzar fácilmente el límite superior mucho antes que el número de inserciones realizadas en la tabla, dependiendo de los valores semilla e incremento.
Además, eliminar filas de una tabla no restablece la IDENTITY
valor (aunque truncar una tabla sí lo hace).
Por lo tanto, aún podría experimentar el error anterior incluso cuando hay muchas menos filas en la tabla que las que IDENTITY
podría sugerir el tipo de datos de la columna.
Solución
Una solución es cambiar el tipo de datos de IDENTITY
columna. Por ejemplo, si es smallint
, cámbielo a int
. O si ya es int
, cámbielo a bigint
.
Otra posible solución sería restablecer la IDENTITY
semilla a un valor más bajo. Esto solo funcionaría si ha eliminado muchas filas de la tabla o si el valor inicial original era mucho mayor que 1
.
Por ejemplo, si la IDENTITY
la columna ya es un int
, pero la IDENTITY
semilla comenzó en digamos 2,000,000,000
, podría restablecer la IDENTITY
semilla a 1
, lo que permitiría insertar otros 2 000 millones de filas.
Funciones útiles
Aquí hay algunas funciones que pueden ser muy útiles para identificar este problema:
IDENT_CURRENT()
– devuelve el último valor de identidad generado para una tabla o vista específica en una columna de identidad.@@IDENTITY
– Devuelve el último valor de identidad insertado en la sesión actual.IDENT_SEED()
– Devuelve la semilla original de una columna de identidad.IDENT_INCR()
– Devuelve el valor de incremento de una columna de identidad.
Además, aquí hay 3 formas de obtener el tipo de datos de una columna en caso de que no esté seguro de cuál es el tipo de datos de la columna.
Mismo error en diferentes escenarios
También puede ocurrir el mismo error (Msg 8115) (con un mensaje de error ligeramente diferente) cuando intenta convertir explícitamente entre tipos de datos y el valor original está fuera del rango del nuevo tipo. Consulte Arreglar "Error de desbordamiento aritmético al convertir int a tipo de datos numérico" en SQL Server para solucionar esto.
También puede ocurrir cuando usa una función como SUM()
en una columna, y el cálculo da como resultado un valor que está fuera del rango del tipo de columna. Consulte Arreglar "Error de desbordamiento aritmético al convertir expresión a tipo de datos int" en SQL Server para solucionar esto.