【问题标题】:Error converting data type numeric to int将数据类型 numeric 转换为 int 时出错
【发布时间】:2013-02-05 19:08:45
【问题描述】:

我在同一个 SQL Server 上有两个数据库。相同的代码。

我有一个带有输入参数@Test INT 的存储过程。在一个数据库中,当我将 NUMERIC 值传递给该输入时,它会被截断并且一切正常。在另一个中,当做同样的事情时,我收到以下错误:

将数据类型 numeric 转换为 int 时出错

这是存储过程的签名:

CREATE PROCEDURE [dbo].[blProductGetTariff]
(
    @CurrencyID             INT,
    @ProductID              INT,
    @TradeDate              DATETIME,
    @TotalDays              INT,
    @onTariff               NUMERIC(22, 10) OUTPUT
)

这是我调用该存储过程的方式:

EXEC blProductGetTariff @CurrencyID, 
                        @MTPLY_VolumeID, 
                        @TradeDate, 
                        @VolumeParam, 
                        @VolumeMultiplierRate OUTPUT

@VolumeParam 是数字,它在一个分贝中很好地输入@TotalDays,但在第二个分贝中却没有。

对此负责的可能的数据库设置是什么,有吗?或者我遗漏了什么,这种奇怪的行为还有其他原因?

更新:Darin 在下面的一个 cmets 中提出了一个很好的观点:“另外,看看你上面的代码,如果你传递一个 numeric(22,10),你可能会溢出 int ). 在这种情况下,您必须使数字更小或传递 bigint".. 他是对的。因此将 INT 更改为 BIGINT 解决了问题,尽管我仍然不明白为什么它不会发生在第一个数据库中,在第一个数据库中一切正常,并且我使用完全相同的数据(实际上是相同的文件)进行测试。

【问题讨论】:

  • 请提供一些在一个数据库中运行良好但在另一个数据库中运行良好的代码。
  • 请检查两个数据库上的 arithabort 和 arithignore 是否相同(根据下面的 Darin)。就此而言,兼容性级别是相同的。

标签: sql-server database int type-conversion numeric


【解决方案1】:

我认为您正在处理 NUMERIC_ROUNDABORT、arithabort 或 arithignore 的数据库范围设置。你可以在这里阅读更多:

arithignore http://msdn.microsoft.com/en-us/library/ms184341.aspx

阿里萨博特 http://msdn.microsoft.com/en-us/library/ms190306.aspx

NUMERIC_ROUNDABORT http://msdn.microsoft.com/en-us/library/ms188791.aspx

我认为在查询之前执行此操作会忽略您的错误。不过,从长远来看,这可能不是您想要做的。修复 proc 可能是最好的。

SET NUMERIC_ROUNDABORT OFF

数据库很可能具有不同的 NUMERIC_ROUNDABORT 值。右键单击 SSMS 中的数据库,然后单击属性。转到选项,您将在杂项下找到此设置。

【讨论】:

  • 谢谢你的回复,Darin.. 我不认为是这样,因为两个数据库都有相同的 NUMERIC_ROUNDABORT 设置。
  • 尝试将 SET NUMERIC_ROUNDABORT OFF 放在查询上方,看看是否失败。
  • 你试过在 SSMS 中运行类似的东西吗?您必须将# 替换为@。声明 #numeric numeric(9,2), #int int set #numeric = 50.23 set #int = #numeric select #int 如果可行,您可以声明另一个变量并在将其传递给存储过程之前进行转换。
  • 另外,看看你上面的代码,如果你传递一个数字(22,10),你可能会溢出 int。在这种情况下,您必须使数字更小或传递 bigint。
  • 非常感谢,达林。我将 INT 更改为 BIGINT,一切都开始在我之前遇到问题的数据库中工作。这很奇怪,因为我使用完全相同的数据在两个数据库中对其进行了测试,并且再次调试证明了这一点。这有什么原因吗?非常感谢您的帮助,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
  • 2015-12-24
  • 2021-04-03
  • 2011-03-29
相关资源
最近更新 更多