2010-07-01 87 views
8

我有一個巨大的INSERT -statement與200列和suddendly我得到了可怕的Error converting data type varchar to numeric。有什麼地方可以看到包含「varchar」值的實際列嗎?我知道我可以一次刪除其中一列,直到錯誤消失,但這非常乏味。「將數據類型varchar轉換爲數字時出錯。」 - 什麼專欄?

+4

您可以一次註釋掉一半列;仍然乏味,但更快。 – 2010-07-01 09:57:26

回答

5

您不指定SQL Server版本或行數。

對於SQL2005 +添加OUTPUT子句的INSERT可能有助於識別流氓行,它會輸出插入的行,直到它,因此下一行是一個與問題遇到錯誤

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 

返回

 
    (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

之前從未試過INSERT上的OUTPUT。謝謝! – Espo 2010-07-09 06:47:21

0

嗯,這只是一種預感,但是如何將數據插入臨時表並使用GUI將數據遷移到其他表呢?如果仍然產生一個錯誤,你至少應該能夠得到對非數字列更多的反饋...

如果它不能正常工作,考慮嘗試this.

乾杯!

6

不幸的是,這個錯誤是一個嚴重的痛苦,沒有簡單的方法來解決它。當我過去遇到它時,我總是不得不評論列組,直到找到罪魁禍首。

另一種方法可能是使用T-SQL中的ISNUMERIC()函數來嘗試查找罪魁禍首。在你的目標表假設每列數字(相應調整,如果不是),你可以試試這個:

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

這將會使包含您的非數字值的行,而應該讓它非常清楚哪一列它是英寸,我知道它很乏味,但至少它可以幫助你追捕實際價值,除了造成麻煩的專欄之外。

相關問題