“将数据类型varchar转换为numeric时出错。”- 是哪一列?

8

我有一条包含200个字段的大型INSERT语句,突然遇到了可怕的将数据类型varchar转换为numeric时出错。 有没有地方可以看到包含"varchar"值的实际列? 我知道我可以逐个删除字段,直到错误消失,但这非常繁琐。


4
您可以一次注释掉一半的列;虽然仍然有些繁琐,但会更快。 - Brian Hooper
3个回答

6

很遗憾,这个错误非常棘手,没有简单的方法来解决它。过去当我遇到类似问题时,我总是不得不将一组列注释掉,直到找到罪魁祸首。

另一种方法可能是在T-SQL中使用ISNUMERIC()函数来尝试查找罪魁祸首。假设目标表中的每一列都是数字(如果不是,请相应调整),您可以尝试以下操作:

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

这将暴露包含非数字值的行,并且应该很清楚地指出它所在的列。我知道这很繁琐,但至少可以帮助您查找实际值,以及引起问题的列。


5
您没有指定SQL Server版本或行数。
对于SQL2005+,在INSERT语句中添加OUTPUT子句可能有助于识别有问题的行,因为它将输出插入的行,直到遇到错误,所以下一行就是有问题的行。
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行)
    Col1        Col2
    ----------- ----------
    1           1
    2           2
    3           3
    Msg 245, 级别 16, 状态 1, 第23行
    将varchar类型的值“4A”转换为int类型时转换失败。

0

好吧,这只是一个猜想,不过把数据插入到临时表中,然后使用 GUI 将数据迁移到另一个表中,怎么样?如果仍然生成错误,您应该至少能够获得有关那个非数字列的更多反馈...

如果不行,考虑尝试this.

干杯!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接