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

时间:2013-02-20 17:05:23

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

我在同一个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在下面的一条评论中提到了一个非常好的观点:“另外,看看上面的代码,如果你传递一个数字,你可能会溢出int(22,10)在这种情况下,你必须使数字变小或传递一个bigint“..他是对的。所以将INT更改为BIGINT解决了这个问题,虽然我仍然不明白为什么它不会发生在第一个数据库中,其中一切正常,INT使用完全相同的数据(实际上是同一个文件)进行测试。

1 个答案:

答案 0 :(得分:4)

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

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

ARITHABORT http://msdn.microsoft.com/en-us/library/ms190306.aspx

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

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

SET NUMERIC_ROUNDABORT OFF

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