代码之家  ›  专栏  ›  技术社区  ›  Espo

“将数据类型varchar转换为numeric时出错。”—什么列?

  •  8
  • Espo  · 技术社区  · 14 年前

    我有一个巨大的 INSERT -有200列的声明,我突然感到恐惧 Error converting data type varchar to numeric . 是否有地方可以看到包含“varchar”值的实际列?我知道我可以一次删除其中一个列,直到错误消失,但这非常乏味。

    3 回复  |  直到 14 年前
        1
  •  5
  •   Martin Smith    14 年前

    您没有指定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.
    
        2
  •  6
  •   SqlRyan    14 年前

    不幸的是,这个错误是一个严重的痛苦,并且没有简单的方法来解决它。当我在过去遇到它的时候,我总是不得不对一组列进行评论,直到找到罪魁祸首。

    另一种方法可能是在T-SQL中使用isnumeric()函数来尝试查找罪犯。假设目标表中的每一列都是数字(如果不是,则相应地进行调整),您可以尝试这样做:

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

    这将公开包含非数字值的行,并应使其非常清楚地显示在哪个列中。我知道这很乏味,但至少它可以帮助你找到实际的价值,除了引起麻烦的专栏之外。

        3
  •  0
  •   nsmyself    14 年前

    好吧,这只是一种预感,但是如何将数据插入临时表并使用GUI将数据迁移到另一个表呢?如果它仍然产生一个错误,你至少应该能够得到更多的非数字列的反馈…

    如果它不起作用,考虑尝试 this.

    干杯!