尽管结果不为零,但存储过程除以零

0 sql sql-server

我有一个存储过程正在调用两个其他存储过程,它们返回正确的值并且非零。

我已经尽力在这个问题上找到了一切

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;
Run Code Online (Sandbox Code Playgroud)

当我执行此SP时,我得到:

消息8134,级别16,状态1,过程updateBudgetCalc,第14行除以零错误。

它确实将@totHrs评估为null。但是在结果中,我看到它查询了两个表,并为totHrs返回了非零值2.22000,对于estHrs返回了5.25。

Zho*_*rov 6

变量@estHrs@totHrs保留执行嵌套存储过程的结果。如果执行时没有错误,将得到这些结果0,这就是您Divide by zero出错的原因。

区分存储过程的执行结果和该过程返回的结果集,这一点很重要。

如果要从存储过程返回单个值,请使用输出参数。如果您的过程返回结果集,则可以将此结果插入表中并从该表中选择适当的值。

具有输出参数的存储过程:

CREATE PROCEDURE [uspOutputParameter]
    @Param int OUTPUT
AS BEGIN
   SET @Param = 1
END

DECLARE @err int
DECLARE @param int

EXECUTE @err = uspOutputParameter @Param OUTPUT
IF @err = 0 BEGIN
    PRINT 'OK'
    PRINT @Param
    END
ELSE BEGIN
    PRINT 'Error'
END
Run Code Online (Sandbox Code Playgroud)

具有结果集的存储过程:

CREATE PROCEDURE [uspResultSet]
AS BEGIN
   SELECT 1 AS Result
END

CREATE TABLE #Temp (Result int)
INSERT INTO #Temp (Result)
EXECUTE uspResultSet

SELECT * 
FROM #Temp
Run Code Online (Sandbox Code Playgroud)