Saltar al contenido

sql: los datos de error, cadena o binarios se truncarían al intentar insertar

octubre 16, 2021
apple touch icon@2

Tuve el mismo problema, incluso después de aumentar el tamaño de las columnas problemáticas en la tabla.

tl; dr: Es posible que también sea necesario aumentar la longitud de las columnas coincidentes en los tipos de tabla correspondientes.

En mi caso, el error provenía del servicio de exportación de datos en Microsoft Dynamics CRM, que permite sincronizar los datos de CRM con una base de datos de SQL Server o una base de datos SQL de Azure.

Después de una larga investigación, llegué a la conclusión de que el servicio de exportación de datos debe estar utilizando Parámetros con valores de tabla:

Puede utilizar parámetros con valores de tabla para enviar varias filas de datos a una instrucción Transact-SQL o una rutina, como un procedimiento almacenado o una función, sin crear una tabla temporal o muchos parámetros.

Como puede ver en la documentación anterior, los tipos de tabla se utilizan para crear el procedimiento de ingestión de datos:

CREATE TYPE LocationTableType AS TABLE (...);
CREATE PROCEDURE dbo.usp_InsertProductionLocation
  @TVP LocationTableType READONLY

Desafortunadamente, no hay forma de alterar un tipo de tabla, por lo que debe eliminarse y volver a crearse por completo. Dado que mi tabla tiene más de 300 campos (😱), creé una consulta para facilitar la creación del Tipo de tabla correspondiente según la definición de las columnas de la tabla (solo reemplace [table_name] con el nombre de su mesa):

SELECT 'CREATE TYPE [table_name]Type AS TABLE (' + STRING_AGG(CAST(field AS VARCHAR(max)), ',' + CHAR(10)) + ');' AS create_type
FROM (
  SELECT TOP 5000 COLUMN_NAME + ' ' + DATA_TYPE
      + IIF(CHARACTER_MAXIMUM_LENGTH IS NULL, '', CONCAT('(', IIF(CHARACTER_MAXIMUM_LENGTH = -1, 'max', CONCAT(CHARACTER_MAXIMUM_LENGTH,'')), ')'))
      + IIF(DATA_TYPE = 'decimal', CONCAT('(', NUMERIC_PRECISION, ',', NUMERIC_SCALE, ')'), '')
      AS field
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_NAME = '[table_name]'
  ORDER BY ORDINAL_POSITION) AS T;

Después de actualizar el tipo de tabla, el servicio de exportación de datos comenzó a funcionar correctamente una vez más. 🙂

close