【问题标题】:Arithmetic overflow error converting money to data type numeric- How to find将钱转换为数字数据类型的算术溢出错误 - 如何查找
【发布时间】:2018-08-06 10:08:29
【问题描述】:

我在 SQL Server 的另一个表中选择和插入数据并收到以下错误:

将钱转换为数字数据类型时出现算术溢出错误。

如何确定是哪些数据导致了此问题?

CREATE TABLE foo
(
      myNum DECIMAL(10, 4)
);

INSERT INTO foo 
    SELECT 1234.567;

【问题讨论】:

  • 获得帮助的唯一方法是展示您的代码
  • 请添加特定的列数据类型和大小
  • 在没有任何示例代码的情况下我能提供的最好的伪 SQL:SELECT YourMoneyColumn, [Other Relevant Columns] FROM YourTAble WHERE TRY_CONVERT(numeric(YourScale, YourPrecision),YourMoneyColumn) IS NULL;
  • 您提供的代码不会产生错误。

标签: sql sql-server decimal


【解决方案1】:

你可以使用try_convert():

select f.*
from foo f
where try_convert(decimal(10, 4), col) is null;

【讨论】:

    【解决方案2】:
    CREATE TABLE #tmp_1(col1 DECIMAL(2,0))
    CREATE TABLE #tmp_2(col2 DECIMAL(12,0))
    CREATE TABLE #errors (error_value VARCHAR(MAX))
    INSERT INTO #tmp_2 VALUES (1222.00)
    INSERT INTO #tmp_2 VALUES (122222.00)
    INSERT INTO #tmp_2 VALUES (1.00)
    
    DECLARE @rec DECIMAL(12,0)
    
    DECLARE get_errors CURSOR FOR SELECT col2 FROM #tmp_2 
    OPEN get_errors
    FETCH NEXT FROM get_errors INTO @rec
    WHILE @@fetch_status <> -1
    BEGIN
    BEGIN TRY
    INSERT #tmp_1 VALUES (@rec)
    END TRY
    BEGIN CATCH
    INSERT INTO #errors VALUES (@rec)
    END CATCH
            FETCH NEXT FROM get_errors INTO @rec
    END
    CLOSE get_errors
    DEALLOCATE get_errors
    
    GO 
    SELECT * FROM #tmp_1
    SELECT * FROM #errors
    DROP TABLE #tmp_1
    DROP TABLE #tmp_2
    DROP TABLE #errors
    

    【讨论】:

    • 是光标以外的任何其他解决方案。我有 110 万条记录
    • 保存你的记录到文件,然后bulk insert到表中加上ERRORFILE选项,这个选项可以让你把错误的记录写入文件,你也可以指定MAXERRORS ,您在其中指出有多少发现的不正确插入批量插入将破坏@vmb
    • @vmb 是的,CURSOR 将是一种非常缓慢的查找问题的方法。但是,您还没有发布您的代码,那么这里的志愿者如何希望发布一个呢? :)
    猜你喜欢
    • 2017-09-25
    • 2021-10-29
    • 2013-05-27
    • 1970-01-01
    相关资源
    最近更新 更多