2013-02-20 191 views
1

我在同一个SQL Server上有两个数据库。相同的代码。将数据类型数值转换为int时出错

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

Error converting data type numeric to 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,但不会在第二个分支中输入。

什么是可能的数据库设置负责这个,是否有一个?或者我错过了一些东西,这种奇怪的行为还有其他原因吗? “Darron在他的一个评论中提出了一个非常好的观点:”另外,看上面的代码,如果你传递一个数字(22,10),你可能会溢出整数int。你必须使数字变小或通过bigint“..他是对的。因此,将INT更改为BIGINT可以解决问题,但我仍然不明白为什么它不会在第一个数据库中发生,因为在INT中一切正常,我使用完全相同的数据(实际上是相同的文件)进行测试。

+1

请给出一些代码在一个数据库中正常工作,但不在其他数据库中。 – 2013-02-20 17:08:49

+0

请检查arithabort和arithignore在两个数据库中是否都是相同的(每个Darin都在下面)。就此而言,兼容性级别是相同的。 – 2013-02-20 18:01:44

回答

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中的数据库,然后单击属性。转到选项,你会在杂项下找到这个设置。

+0

谢谢Darin的回复.. 我不认为这是它,因为两个数据库都有相同的NUMERIC_ROUNDABORT设置。 – IgorShch 2013-02-20 17:44:46

+0

尝试将SET NUMERIC_ROUNDABORT置于您的查询之上并查看是否失败。 – darin 2013-02-20 18:49:46

+0

不幸的是,不幸的是。但非常感谢您的帮助。 – IgorShch 2013-02-21 10:07:05

相关问题