1

我在同一个 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一个分贝中,但不是在第二个分贝中。

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

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

4

1 回答 1

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

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

SET NUMERIC_ROUNDABORT OFF

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

于 2013-02-20T17:17:22.973 回答