Tengo un procedimiento almacenado que inserta 650 campos en una tabla. La inserción está fallando con un error de truncamiento.
Es un simple
INSERT INTO
SELECT (a bunch of fields)
FROM (a bunch of tables)
A continuación se muestra el mensaje de error:
Msg 8152, Nivel 16, Estado 14, Procedimiento DSP_Procedure, Línea 1075 Cadena o los datos binarios se truncarían.
¿Hay alguna forma rápida de identificar qué campo está causando el error de truncamiento?
El hecho de que la instrucción select que se inserte en la tabla tenga 650 campos hace que sea difícil determinar qué campo está causando el error de truncamiento.
Estoy pensando que tal vez pueda comentar bloques de campos a la vez para que el SP solo inserte 100 campos a la vez y luego ejecute el SP 6 o 7 veces diferentes hasta que al menos pueda reducir a un grupo de 100 campos eso contendrá el campo que está causando el error de truncamiento.
Alternativamente, estoy pensando que tal vez pueda simplemente SELECT INTO
una nueva tabla y luego comparar las longitudes de datos en la tabla con las longitudes de datos de la tabla de destino en la que estoy tratando de insertar en mi SP para ver qué campo contiene una longitud de campo más larga de lo esperado. ..
Estoy usando SQL Server 2014.
¿Alguna alternativa más fácil?
fuente
Respuestas:
Si está utilizando SQL Server 2016 (SP2, CU6 o posterior), una opción es activar el indicador de seguimiento 460, por ejemplo
(QUERYTRACEON 460)
. La salida indicará la columna y los datos ofensivos.Vea este artículo para más detalles. https://www.brentozar.com/archive/2019/03/how-to-fix-the-error-string-or-binary-data-would-be-truncated/
Si no le importa el truncamiento, puede usarlo
SET ANSI_WARNINGS OFF
para ignorar ese tipo de truncamiento.fuente
Desafortunadamente, ha encontrado una "característica" bastante antigua . Ha habido un boleto de Connect abierto desde 2008, y durante casi diez años esto no ha sido lo suficientemente significativo como para justificar una solución.
La solución estándar es, como se imaginó,
select into...
seguida de una comparación de metadatos de tabla. Otra posibilidad es la búsqueda binaria en la columna ofensiva, pero también es trabajo manual. Hay algunos trucos para la comparación de metadatos, pero no existe una solución simple y elegante. Quizás algunas herramientas de terceros serían de ayuda, pero no estoy al tanto de eso.fuente
Usar (QUERYTRACEON 460) no funcionó para mí al ponerlo al final de mi consulta.
Lo encendí en el nivel DB y funcionó:
Pero asegúrese de volver a apagarlo una vez que haya encontrado y solucionado el problema, ¡no lo deje encendido!
fuente