2010-07-01 20 views
8

Tengo una enorme INSERT -establecimiento con 200 columnas y de repente me sale el temido Error converting data type varchar to numeric. ¿Hay algún lugar donde pueda ver la columna real que contiene el valor "varchar"? Sé que puedo eliminar una de las columnas a la vez hasta que el error desaparezca, pero es muy tedioso."Error al convertir el tipo de datos varchar a numérico". - ¿Qué columna?

+4

Puede comentar la mitad de las columnas a la vez; sigue siendo tedioso, pero más rápido. –

Respuesta

5

No especifica la versión del servidor SQL o el número de filas.

Para SQL2005 + añadiendo la cláusula OUTPUT a la inserción podría ayudar a identificar la fila Rogue en que se dará salida a las filas insertadas hasta que encuentra un error por lo que la siguiente fila es el que tiene el problema

DECLARE @Source TABLE 
(
Col1 VARCHAR(10), 
Col2 VARCHAR(10) 
) 

INSERT INTO @Source 
SELECT '1','1' UNION ALL 
SELECT '2','2' UNION ALL 
SELECT '3','3' UNION ALL 
SELECT '4A','4' UNION ALL 
SELECT '5','5' 


DECLARE @Destination TABLE 
(
Col1 INT, 
Col2 VARCHAR(10) 
) 

INSERT INTO @Destination 
OUTPUT inserted.* 
SELECT * 
FROM @Source 

devoluciones

 
    (5 row(s) affected) 
    Col1  Col2 
    ----------- ---------- 
    1   1 
    2   2 
    3   3 
    Msg 245, Level 16, State 1, Line 23 
    Conversion failed when converting the varchar value '4A' to data type int. 
+0

Nunca probé SALIDA en INSERT antes. ¡Gracias! – Espo

0

Bueno, esto es sólo una corazonada, pero ¿qué hay de insertar los datos en una tabla temporal y el uso de la GUI para migrar los datos a la otra tabla? Si sigue generando un error, al menos debe ser capaz de obtener más información sobre esa columna no numérica ...

Si esto no funciona, considere tratando this.

Salud!

6

Desafortunadamente, este error es un problema grave y no hay una manera fácil de solucionarlo. Cuando lo he encontrado en el pasado, siempre he tenido que comentar grupos de columnas hasta que encuentro al culpable.

Otro enfoque podría ser utilizar la función ISNUMERIC() en T-SQL para intentar encontrar el culpable. Suponiendo que cada columna de la tabla de destino es numérico (ajustar en consecuencia si no es), podría intentar esto:

SELECT * 
    FROM SourceTable 
WHERE ISNUMERIC(Column1) = 0 
    OR ISNUMERIC(Column2) = 0 
    OR ISNUMERIC(Column3) = 0 
    OR ISNUMERIC(Column4) = 0 
    ... 

Esto expondrá la fila que contiene el valor no numérico, y debe dejar muy claro qué columna está dentro. Sé que es tedioso, pero al menos te ayuda a buscar el valor real, además de la columna que está causando problemas.

Cuestiones relacionadas