【问题标题】:Showing null instead of throwing a zero division error by try-catch通过 try-catch 显示 null 而不是引发零除法错误
【发布时间】:2021-08-29 20:11:40
【问题描述】:

为什么当count 和sum 都是0 时这个过程返回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

如果表中没有任何内容,即sum 和count 都为0,如何将第一个过程更改为与第二个过程相同?

谢谢。

【问题讨论】:

  • 请注意,您可以像这样select @sum = sum(base_salary), @count = count(*) from position 或只是select sum(base_salary) / count(*) from position 组合selects。另请注意,您将获得整数除法
  • @Charlieface 谢谢。
  • 如果你不打算对它们做任何事情,不要吃错误。并且不要将错误转换为结果集。要么不接,要么重新扔。

标签: sql sql-server stored-procedures try-catch


【解决方案1】:

如果表中没有任何内容,那么您就没有行。在这种情况下,SUM() 返回NULL,而不是0。

如果你想让错误发生,那么用一个值替换它:

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

count() 仍将返回 0,因此这应该会产生错误。

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

【讨论】:

  • 谢谢它有效。我在询问之前尝试了if (@sum = NULL) set @sum = 0,但它没有用。有什么问题?
  • @AlexJ if (@sum IS NULL) 因为你不能将 null 与任何东西进行比较
  • @AlexJ 认为null 表示“未知值”;你不能说if unknown value=x then... 因为它是未知的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
相关资源
最近更新 更多