当前位置: 首页 > 面试题库 >

MERGE的算术溢出错误(数字到数字):SQL Server错误?

呼延鸿畅
2023-03-14
问题内容

我有一个TargetTable具有一DECIMAL(20, 7)列的目标表。我也有一个SourceTable具有一DECIMAL(20, 7)列的源表,但是该表中的值无论如何都是整数。

当我尝试将数据UPSERT成TargetTableSourceTable通过MERGE声明,我得到一个标准错误。

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

我真的不明白为什么会发生这种情况,因为两种数据类型都是相同的。

但是,奇怪的是:当我使用SELECT INTOonTargetTable创建测试TestTable,然后将合并目标更改TestTable为时,upsert完成。我也不明白为什么会这样,因为TargetTable并且TestTable在大多数情况下都是相同的。

以前是否有人遇到过这个问题,这是一个错误,还是我缺少一些模糊的SQL Server细微差别?

样例代码

失败:

SET NUMERIC_ROUNDABORT Off
GO

MERGE
    TargetTable Target
USING
    (
        SELECT
            cast(forecast as DECIMAL(20, 7)) forecast
          ,[SegmentID]
          ,[Country]
          ,[Environment]
          ,[YearColumn]
          ,[ForecastYear]
          ,[Criterion]
        FROM
            SourceTable
    ) Source
    ON
    (
        Target.SegmentID = Source.SegmentID
        AND Target.Country = Source.Country
        AND Target.Environment = Source.Environment
        AND Target.YearColumn = Source.YearColumn
        AND Target.ForecastYear = Source.ForecastYear
        AND Target.Criterion = Source.Criterion
    )
WHEN NOT MATCHED BY TARGET AND Source.Forecast <> 0 AND Source.Forecast IS NOT NULL THEN
    INSERT (SegmentID, Country, Environment, YearColumn, Forecast, ForecastYear, Criterion)
    VALUES (Source.SegmentID, Source.Country, Source.Environment, Source.YearColumn, Source.Forecast, Source.ForecastYear, Source.Criterion)
WHEN MATCHED AND (Source.Forecast = 0 OR Source.Forecast IS NULL) THEN
    DELETE
WHEN MATCHED AND Source.Forecast <> Target.Forecast THEN
    UPDATE SET Target.Forecast = Source.Forecast;

成功:

SELECT
    *
INTO
    TestTable
FROM
    TargetTable
GO

SET NUMERIC_ROUNDABORT Off
GO

MERGE
    TestTable Target
USING
    (
        SELECT
            cast(forecast as DECIMAL(20, 7)) forecast
          ,[SegmentID]
          ,[Country]
          ,[Environment]
          ,[YearColumn]
          ,[ForecastYear]
          ,[Criterion]
        FROM
            SourceTable
    ) Source
    ON
    (
        Target.SegmentID = Source.SegmentID
        AND Target.Country = Source.Country
        AND Target.Environment = Source.Environment
        AND Target.YearColumn = Source.YearColumn
        AND Target.ForecastYear = Source.ForecastYear
        AND Target.Criterion = Source.Criterion
    )
WHEN NOT MATCHED BY TARGET AND Source.Forecast <> 0 AND Source.Forecast IS NOT NULL THEN
    INSERT (SegmentID, Country, Environment, YearColumn, Forecast, ForecastYear, Criterion)
    VALUES (Source.SegmentID, Source.Country, Source.Environment, Source.YearColumn, Source.Forecast, Source.ForecastYear, Source.Criterion)
WHEN MATCHED AND (Source.Forecast = 0 OR Source.Forecast IS NULL) THEN
    DELETE
WHEN MATCHED AND Source.Forecast <> Target.Forecast THEN
    UPDATE SET Target.Forecast = Source.Forecast;

问题答案:

您的代码似乎完全没有错误。此外,当您使用与原始表相同的结构和数据创建另一个表作为目标时,它可以正常工作的事实表明该错误不存在。最可能的原因是您在原始表上有一个触发器,该触发器正在执行失败的查询,这就是您所看到的错误。



 类似资料:
  • 问题内容: 因此,我要在其属性中使用数据类型为char,十进制和日期的表格。我收到了一些算术溢出错误的结果。不知道您是否可以帮助我学习创建此表。 这是确切的消息结果: 消息8115,级别16,状态8,行1将数字转换为数据类型数字的算术溢出错误。该语句已终止。 问题答案: 您的字段只能包含4位数字,带有两位小数,因此最多为99,99。您试图插入包含125,00作为值的行。这就是为什么您溢出(超出容量

  • 问题内容: 我正在设计SQL Server 2008 R2 SP2 Express数据库中的表。我创建的表具有用于数据的列和用于自动递增标识的列,并假设行数不多(这就是为什么我选择0-255 )。当我添加超过255行时,即使删除该表中的所有行并尝试添加一个新行,该错误仍然会永久发生。我正在使用SQL Server Management Studio Express进行此操作。 如何强制数据库引擎检

  • 问题内容: 这可能很容易。我们知道运算符会对整数进行整数运算(环绕),而运算符会导致错误。 这是什么错误?我无法捕获它,也无法将其变成可选的: 我很确定,这种错误与(除以零)中的错误相同,但我不知道是否可以捕获此类错误。我缺少什么简单的东西?能不能被困住?如果是这样,怎么办? 问题答案: 在异常和运行时错误之间进行区分。引发异常并可以将其捕获。运行时错误会使您的程序停滞不前。添加和获取溢出是简单而

  • 问题内容: 以下是我正在使用的表结构和数据类型的子集。 我想编写一个查询,让我知道“ Val”列是否小于等于9.00(必须为数字数据类型)。我通过执行以下操作来做到这一点: 这给了我一个算术溢出错误。但是,如果我排除值“ 10”的数据行: 它的工作没有任何问题。 我的问题不是如何解决此问题,因为我知道我可以简单地将数据转换为所需的格式。 我的问题是,为什么“ Val”列中的“ 10”值返回错误。当

  • 在函数中,我在这一行上有ORA-06502错误: 我看这里没有任何转换问题/完全困惑/

  • 问题内容: 此选择语句为我提供了算术错误消息: 尽管这一方法有效: 数据可能出问题了(我已经检查了空值,但没有一个)? 问题答案: 发现问题出在日期设置为9999-12-31时,可能要处理大数以十进制表示。从十进制更改为浮点,并且所有事物都像魅力一样起作用。