我有一个存储过程,它调用另外两个存储过程,它们返回正确的值,并且是非零的。
关于这个问题我已经尽了全力
ALTER PROCEDURE [dbo].[updateBudgetCalc](@JobNum AS nvarchar(50))
AS
BEGIN
DECLARE @estHrs float
DECLARE @totHrs float
EXEC @totHrs = PanelShop.dbo.getHoursTotal @JobNum
EXEC @estHrs = PanelShop.dbo.getHoursEst @JobNum
UPDATE ActiveList SET PercentOfBudget = @estHrs/@totHrs WHERE Jobnum = @JobNum
return (@totHrs)
END;
当我执行此SP时,我得到:
消息8134,级别16,状态1,程序updateBudgetCalc,第14行遇到除以零错误。
它确实将@totHrs计算为null,但在结果中,我看到它查询了两个表,并为totHrs返回了非零值2.22000,为estHrs返回了值5.25
2条答案
按热度按时间6yt4nkrj1#
变量
@estHrs
和@totHrs
保存嵌套存储过程的执行结果。如果它们的执行没有错误,这些结果将是0
,这就是Divide by zero
错误的原因。区分存储过程的执行结果和该过程返回的结果集是很重要的。
如果要从存储过程返回单个值,请使用输出参数。如果过程返回结果集,则可以将此结果插入表中,并从此表中选择适当的值。
具有输出参数的存储过程:
具有结果集的存储过程:
gcmastyq2#
ZHorov的解释不太正确,存储过程可以返回值,这些值是整数,如果没有显式的
return
,存储过程就会失败,返回NULL
。设置存储过程并被类型误导是完全正确的:
这个函数返回什么?它返回
2
。为什么?返回值是一个整数。SQL Server将2.3转换为整数并返回它。这是在存储过程调用中获得的。很有可能,您返回的值介于0和1之间,并且这些值被截断为
0
--导致被零 debugging 误。佐罗夫的解是正确的。使用输出参数。