c# - truncado - mens 8152 nivel 16 estado 14 línea 87 los datos de cadena o binarios se truncarían
SQLException: cadena o datos binarios se truncarán (11)
Tengo un código C # que hace muchas inserciones en un lote. Mientras ejecutaba estas declaraciones, obtuve el error "String or binary data truncated" y la transacción roledback.
Para averiguar qué instrucción de inserción provocó esto, necesito insertar uno por uno en el SQLServer hasta que aparezca el error.
¿Hay alguna forma inteligente de descubrir qué enunciado y qué campo causó este problema usando el manejo de excepciones? (SqlException)
- Obtenga la consulta que está causando los problemas (también puede usar el Analizador de SQL si no tiene la fuente)
- Elimine todas las cláusulas WHERE y otras partes sin importancia hasta que básicamente se quede con las partes SELECT y FROM
- Agregar WHERE 0 = 1 (esto seleccionará solo la estructura de la tabla)
- Agregue INTO [MyTempTable] justo antes de la cláusula FROM
Deberías terminar con algo como
SELECT
Col1, Col2, ..., [ColN]
INTO [MyTempTable]
FROM
[Tables etc.]
WHERE 0 = 1
Esto creará una tabla llamada MyTempTable en su base de datos que puede comparar con la estructura de su tabla de destino, es decir, puede comparar las columnas en ambas tablas para ver dónde difieren. Es un poco una solución, pero es el método más rápido que he encontrado.
Con Linq To SQL, depuré registrando el contexto, ej. Context.Log = Console.Out
Luego escaneó el SQL para verificar si había errores obvios, había dos:
-- @p46: Input Char (Size = -1; Prec = 0; Scale = 0) [some long text value1]
-- @p8: Input Char (Size = -1; Prec = 0; Scale = 0) [some long text value2]
el último que encontré escaneando el esquema de la tabla con los valores, el campo era nvarchar (20) pero el valor era 22 caracteres
-- @p41: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [1234567890123456789012]
Depende de cómo está haciendo las llamadas Insertar. ¿Todo como una sola llamada o como llamadas individuales dentro de una transacción? Si las llamadas individuales, entonces sí (a medida que itera a través de las llamadas, tome la que falla). Si una llamada grande, entonces no. SQL está procesando toda la instrucción, por lo que está fuera del alcance del código.
En general, es que está insertando un valor que es mayor que el valor máximo permitido. Por ejemplo, la columna de datos solo puede contener hasta 200 caracteres, pero está insertando una cadena de 201 caracteres
En general, no hay una forma de determinar qué enunciado particular causó el error. Si está ejecutando varios, puede mirar el generador de perfiles y ver la última declaración completa y ver cuál es la declaración posterior, aunque no tengo idea de si ese enfoque es factible para usted.
En cualquier caso, una de sus variables de parámetros (y los datos que contiene) es demasiado grande para el campo en el que intenta almacenar los datos. Compruebe los tamaños de los parámetros en función de los tamaños de las columnas y los campos en cuestión deberían ser evidentes rápidamente.
En nuestro caso, aumente el tamaño permitido del carácter o campo de la tabla sql que es menor que el número total de caracteres publicados desde la interfaz. De ahí que resolver el problema.
Este tipo de error ocurre cuando el tipo de datos de la columna del Servidor SQL tiene una longitud que es menor que la longitud de los datos ingresados en el formulario de entrada.
La mayoría de las respuestas aquí son para hacer la comprobación obvia, que la longitud de la columna como se define en la base de datos no es más pequeña que los datos que está tratando de pasar a la misma.
Varias veces me han picado yendo a SQL Management Studio, haciendo una rápida:
sp_help ''mytable''
y me confundo por unos minutos hasta que me doy cuenta de que la columna en cuestión es un nvarchar , lo que significa que la longitud informada por sp_help es realmente el doble de la longitud real admitida porque es un tipo de datos de doble byte (unicode).
es decir, si sp_help informa nvarchar Longitud 40, puede almacenar 20 caracteres como máximo.
También podría deberse a que está intentando volver a poner un valor null
en la base de datos. Entonces, una de sus transacciones podría tener nulos en ellas.
este tipo de error generalmente ocurre cuando tiene que poner caracteres o valores más que los que ha especificado en la tabla Base de datos como en ese caso: especifica transaction_status varchar (10) pero en realidad está intentando almacenar _transaction_status que contiene 19 caracteres. es por eso que enfrentaste este tipo de error en este código
BEGIN TRY
INSERT INTO YourTable (col1, col2) VALUES (@val1, @val2)
END TRY
BEGIN CATCH
--print or insert into error log or return param or etc...
PRINT ''@val1=''+ISNULL(CONVERT(varchar,@val1),'''')
PRINT ''@val2=''+ISNULL(CONVERT(varchar,@val2),'''')
END CATCH