La cadena de SQL Server o los datos binarios se truncarían

Resuelto Jim Evans asked hace 13 años • 25 respuestas

Estoy involucrado en un proyecto de migración de datos. Recibo el siguiente error cuando intento insertar datos de una tabla en otra tabla (SQL Server 2005):

Mensaje 8152, nivel 16, estado 13, línea 1
La cadena o los datos binarios se truncarían.

Las columnas de datos de origen coinciden con el tipo de datos y están dentro de las definiciones de longitud de las columnas de la tabla de destino, por lo que no sé qué podría estar causando este error.

Jim Evans avatar Jun 17 '11 23:06 Jim Evans
Aceptado

Deberá publicar las definiciones de las tablas de origen y de destino para que podamos determinar dónde está el problema, pero la conclusión es que una de sus columnas en la tabla de origen es más grande que las columnas de destino . Puede ser que estés cambiando de formato de una forma que no conocías. El modelo de base de datos desde el que se está moviendo también es importante para determinarlo.

IAmTimCorey avatar Jun 17 '2011 16:06 IAmTimCorey

Como ya han dicho otros, uno de los tipos de datos de sus columnas en la tabla de origen es más grande que las columnas de destino.

Una solución sencilla es desactivar la advertencia y permitir que se produzca el truncamiento. Por lo tanto, si recibe este error pero está seguro de que es aceptable truncar (cortar al tamaño) los datos de su antigua base de datos/tabla, simplemente puede hacer lo siguiente;

SET ANSI_WARNINGS OFF;
-- Your insert TSQL here.
SET ANSI_WARNINGS ON;

Como se indicó anteriormente, recuerde siempre volver a activar las advertencias después.

Rudi Kershaw avatar Feb 21 '2015 21:02 Rudi Kershaw

El problema es bastante simple: una o más de las columnas de la consulta de origen contienen datos que exceden la longitud de su columna de destino. Una solución simple sería tomar su consulta fuente y ejecutarla Max(Len( source col ))en cada columna. Es decir,

Select Max(Len(TextCol1))
    , Max(Len(TextCol2))
    , Max(Len(TextCol3))
    , ...
From ...

Luego compare esas longitudes con las longitudes de los tipos de datos en su tabla de destino. Al menos uno excede la longitud de la columna de destino.

Si está absolutamente seguro de que este no debería ser el caso y no le importa si no es el caso , entonces otra solución es forzar la conversión de las columnas de consulta de origen a su longitud de destino (lo que truncará cualquier dato que sea demasiado largo):

Select Cast(TextCol1 As varchar(...))
    , Cast(TextCol2 As varchar(...))
    , Cast(TextCol3 As varchar(...))
    , ...
From ...
Thomas avatar Jun 17 '2011 16:06 Thomas