2013-01-23 268 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()