2013-01-23 267 views
1

在打印出包含除法的一些计算值以计算百分比时,我收到除零误差。我并不担心它正在发生,我只是想知道如何打印0以及其余行,而不是打印错误,即0%。T-SQL:如何处理打印语句中的错误?

这是我的print语句:

print cast(@usercode as varchar) + ' ' + @username + space(4) + 
    'cr' + space(4) + cast(@totalUserVolumeCredit as varchar) + 
    space(4) + cast(@userUnpaids as varchar) + space(4) + 
    cast(@userDisputes as varchar) + space(4) + 
    cast((@userUnpaids + @userDisputes) as varchar) + space(4) + 
    cast(((@userUnpaids + @userDisputes)/@totalUserVolumeCredit) as varchar) + --error line 
    space(4) + cast(@userRedirectsVolume as varchar); 

回答

1
print cast(@usercode as varchar) + ' ' + @username + space(4) + 
    'cr' + space(4) + cast(@totalUserVolumeCredit as varchar) + 
    space(4) + cast(@userUnpaids as varchar) + space(4) + 
    cast(@userDisputes as varchar) + space(4) + 
    cast((@userUnpaids + @userDisputes) as varchar) + space(4) + 
    case @totalUserVolumeCredit when 0 then '0' else 
     cast(((@userUnpaids + @userDisputes)/@totalUserVolumeCredit) as varchar) 
    end + 
    space(4) + cast(@userRedirectsVolume as varchar); 

Demo

+0

如果'@ totalUserVolumeCredit'为0,那么通过外观的东西,这将只打印'0'?这不是我在我的问题中的意思:我的意思是如果该变量为零(因此会导致除以零错误),然后仍然打印该行的其余部分以及0%,而不是仅仅传出错误消息。 – Logan

+0

@Logan:啊,对不起,我把你的问题弄错了。解决方案是一样的,但是,这只是你把条件放在哪里的问题。我已经更新了我的代码。 –

+0

谢谢,它工作得很好:) – Logan

1

你的print语句是复杂的。我建议分解计算并分配变量,然后打印结果。您可以使用T-SQL if/else这样的:

declare @calculation varchar(20) 

if @totalUserVolumeCredit = 0 
    set @calculation = '0%' 
else 
    set @calculation = cast((@userUnpaids + @userDisputes)/@totalUserVolumeCredit as varchar) 

print cast(@usercode as varchar) + ' ' + @username + space(4) + 
    'cr' + space(4) + cast(@totalUserVolumeCredit as varchar) + 
    space(4) + cast(@userUnpaids as varchar) + space(4) + 
    cast(@userDisputes as varchar) + space(4) + 
    cast((@userUnpaids + @userDisputes) as varchar) + space(4) + 
    @calculation + -- former error line 
    space(4) + cast(@userRedirectsVolume as varchar); 

或者,使用SQL Server 2005开始,您可以使用try/catch。简单的例子:

DECLARE @x int SET @x = 5 
DECLARE @y int SET @y = 0 

begin try 
    PRINT @x/@y 
end try 
begin catch 
    PRINT ERROR_MESSAGE() 
end catch 

用的try/catch你把麻烦的计算成try/catch块,并处理它以任何方式适合您的问题域。

+0

这条路线需要我的代码有更多的变化(这是一个重复的问题),所以我而是用大卫的回答。尽管如此,还是个好主意:)谢谢! – Logan

0

你可以只改变这个表达式:

(@userUnpaids + @userDisputes)/@totalUserVolumeCredit 

这样的:

,你总是会得到0出来的当除数为0.

这是它如何工作的:

  1. nullif()替换除数使用NULL时,它的0

  2. 因为空除数,表达式的结果变为NULL。

  3. isnull()变成空的结果为0。(你也可以使用更多的标准,而不是coalesce()