显示 null 而不是通过 try-catch 抛出除零错误

Showing null instead of throwing a zero division error by try-catch

为什么当 countsum 都为 0 时此过程 return NULL?

create procedure avgSalaryByPositions
as
begin
begin try  
    declare @sum int
    select @sum=sum(base_salary) from position
    declare @count int
    select @count=count(*) from position
    select @sum/@count
end try
begin catch
    select
        ERROR_NUMBER() AS ErrorNumber  
        ,ERROR_SEVERITY() AS ErrorSeverity  
        ,ERROR_STATE() AS ErrorState  
        ,ERROR_PROCEDURE() AS ErrorProcedure  
        ,ERROR_LINE() AS ErrorLine  
        ,ERROR_MESSAGE() AS ErrorMessage;  
end catch
end

并且不会产生这样的输出?

create procedure blablabla
as
begin
BEGIN TRY  
    SELECT 1/0;  
END TRY  
BEGIN CATCH  
    SELECT  
        ERROR_NUMBER() AS ErrorNumber  
        ,ERROR_SEVERITY() AS ErrorSeverity  
        ,ERROR_STATE() AS ErrorState  
        ,ERROR_PROCEDURE() AS ErrorProcedure  
        ,ERROR_LINE() AS ErrorLine  
        ,ERROR_MESSAGE() AS ErrorMessage;  
END CATCH;  
end
GO  


exec blablabla

当 table 中没有任何内容时,如何将第一个过程更改为与第二个过程相同,意思是当 sumcount 均为 0 时?

谢谢。

如果 table 中没有任何内容,那么您就没有 。在那种情况下,SUM() returns NULL,而不是 0.

如果您希望发生错误,请将其替换为一个值:

select @sum = coalesce(sum(base_salary), 0) from position;

count() 仍然会 return 0,所以这应该会产生错误。

请注意,avg() 是一种更明智的计算方式。