sql >> Base de Datos >  >> RDS >> Sqlserver

Solucione el "Error de desbordamiento aritmético al convertir IDENTIDAD en tipo de datos ..." en SQL Server

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.