我在同一个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使用完全相同的数据(实际上是同一个文件)进行测试。
答案 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中的数据库,然后单击属性。转到选项,您将在杂项下找到此设置。