Los datos de cadena o binarios se truncarían - Solución

El mensaje de error 8152 "Los datos de cadena o binarios se truncarían" es algo que verás muchas veces en tu vida laboral como programador.

Causa - ¿A que se debe?


Se debe a que tratamos de insertar o actualizar un campo cadena o binario con un dato que excede su capacidad. Generalmente, el problema es con un campo tipo cadena.

Por ejemplo, si el campo "Comentario" tiene un tamaño de 500 caracteres, y tratamos de grabar un texto de 1000 caracteres, veremos ese error.

Solución


Cuando tengamos ese error, es hora de revisar los sospechosos.

  • Generalmente serán campos cadena (char, varchar, nchar, nvarchar).

  • Revisemos la longitud de la información a grabar en esos campos.


Mi estrategia


Me ha tocado en varios casos este error, y normalmente basta revisar la consulta SQL para encontrar el error, pero en ocasiones me pasó, que la tabla es enorme, más de 100 campos tipo cadena.

En ese caso, arme una hoja de excel, con cinco columnas:

  • Columna 1: el nombre del campo o columna (solo los tipo cadena que son los que producen el error).

  • Columna 2: el tamaño del campo.

  • Columna 3: el texto a grabar en el campo.

  • Columna 4: el tamaño del texto en el campo (calculado con una fórmula de excel).

  • Column 5: una fórmula que indique si el valor de la columna 4 supere al valor de la columna 2.


¿Muy trabajoso? Si, pero me facilita las cosas, si te pones a revisar una consulta con 120 campos tipo cadena, puedes terminar con el ojo cansado.

Recuerda que el error se produce en un INSERT o una sentencia UPDATE. En ambos casos, convierte la sentencia SQL en un INSERT INTO y crea una tabla auxiliar, que tendría el mismo esquema que la tabla original.

Sql Server 2019


El error al que nos referimos:  'Los datos de cadena o binarios se truncarían' ("String or binary data would be truncated") brindará un mensaje más claro en la versión 2019 de Sql Server.

En la versión 2019 será así:

Msg 2628, Level 16, State 1, Line 8
String or binary data would be truncated in table 'Sandbox.dbo.Customer', column 'CustomerName'. Truncated value: 'Is this th'.

Hay personas utilizando SQL Server 2019 pero no encuentran activo esa forma de mostrar el error, de modo que si tienes SQL Server 2019 o superior, y no se muestra en el mensaje de error el nombre de la columna, debes ejecutar el siguiente script:
ALTER DATABASE SCOPED CONFIGURATION
SET VERBOSE_TRUNCATION_WARNINGS = ON;

Otra forma en que podría ocurrir es que el nivel de compatibilidad de la base de datos no es 150 o superior (SQL Server 2019), ya que podría ser una base de datos creada en una versión anterior de SQL Server, y su nivel de compatibilidad debería cambiarse para que sea 150, pero ese cambio no es recomendable si la base de datos está en producción, debido a que habrían varias cosas que cambian, y debería validarse el código SQL escrito, si es compatible. Mi recomendación en este caso sería quedarse sin esa funcionalidad.

Comentarios