SQL Server 尽管结果为非零,存储过程仍被零除

5kgi1eie  于 2023-01-29  发布在  其他
关注(0)|答案(2)|浏览(244)

我有一个存储过程,它调用另外两个存储过程,它们返回正确的值,并且是非零的。
关于这个问题我已经尽了全力

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

6yt4nkrj

6yt4nkrj1#

变量@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

具有结果集的存储过程:

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

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

SELECT * 
FROM #Temp
gcmastyq

gcmastyq2#

ZHorov的解释不太正确,存储过程可以返回值,这些值是整数,如果没有显式的return,存储过程就会失败,返回NULL
设置存储过程并被类型误导是完全正确的:

create procedure f
as begin
    return cast(2.3 as float)
end;

declare @f float;

exec @f = f;

print @f;

这个函数返回什么?它返回2。为什么?返回值是一个整数。SQL Server将2.3转换为整数并返回它。这是在存储过程调用中获得的。
很有可能,您返回的值介于0和1之间,并且这些值被截断为0--导致被零 debugging 误。
佐罗夫的解是正确的。使用输出参数。

相关问题