2010-07-01 88 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 
    ... 

这将会使包含您的非数字值的行,而应该让它非常清楚哪一列它是英寸,我知道它很乏味,但至少它可以帮助你追捕实际价值,除了造成麻烦的专栏之外。

相关问题