2010-07-01 11 views
8

Ho un enorme INSERT -stato con 200 colonne e improvvisamente ho il temuto Error converting data type varchar to numeric. C'è un posto dove posso vedere la colonna attuale che contiene il valore "varchar"? So che posso rimuovere una delle colonne alla volta finché l'errore non scompare, ma è molto noioso."Errore durante la conversione del tipo di dati varchar in numerico." - Quale colonna?

+4

È possibile commentare metà delle colonne alla volta; ancora noioso, ma più veloce. –

risposta

5

Non si specifica la versione di SQL Server o il numero di righe.

Per SQL2005 + aggiungendo la clausola OUTPUT all'inserto potrebbe aiutare a identificare la riga scorrette in che esso emetta le righe inserite fino a un errore così la riga successiva è quello con il 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 

ritorni

 
    (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

Mai provato OUTPUT su INSERT prima. Grazie! – Espo

0

Bene, questa è solo un'ipotesi, ma che dire di inserire i dati in una tabella temporanea e utilizzare la GUI per migrare i dati nell'altra tabella? Se genera ancora un errore, si dovrebbe almeno essere in grado di ottenere più feedback su quella colonna non numerico ...

Se non funziona, considerare cercando this.

Cheers!

6

Sfortunatamente, questo errore è un problema serio e non esiste un modo semplice per risolverlo. Quando l'ho incontrato in passato, ho sempre dovuto commentare gruppi di colonne finché non ho trovato il colpevole.

Un altro approccio potrebbe essere utilizzare la funzione ISNUMERIC() in T-SQL per cercare di trovare il colpevole. Supponendo che ogni colonna della tabella di destinazione è numerico (regolare di conseguenza se non è), si potrebbe provare questo:

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

Questo esporrà la riga che contiene il valore non numerico, e dovrebbe rendere abbastanza chiaro quale colonna è dentro. So che è noioso, ma almeno ti aiuta a dare la caccia al valore reale, oltre alla colonna che sta causando problemi.

Problemi correlati