1

ゼロ除算エラーを受け取っているパーセンテージを計算するために除算を含むいくつかの計算値を印刷する際に。私はそれが起こっていることを心配していません、私はそれがエラー、すなわち0%を印刷する代わりに、行の残りの部分と一緒に0を印刷する方法を知りたいだけです。

これは私の印刷物の声明です:

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);
4

3 に答える 3

1

印刷ステートメントは複雑です。計算を分割して変数を割り当て、結果を出力することをお勧めします。次のように、T-SQLを使用できます。

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ブロックに入れて、問題のドメインに適した方法で処理します。

于 2013-01-23T15:00:30.137 に答える
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);

デモ

于 2013-01-23T15:02:20.830 に答える
0

この式を変更するだけで済みます。

(@userUnpaids + @userDisputes) / @totalUserVolumeCredit

このような:

isnull((@userUnpaids + @userDisputes) / nullif(@totalUserVolumeCredit, 0), 0)

除数が0のときは、常に0を取得します。

仕組みは次のとおりです。

  1. nullif()0の場合、除数をNULLに置き換えます。

  2. NULL除数のため、式の結果はNULLになります。

  3. isnull()NULLの結果を0に変換します(coalesce()代わりに、より標準を使用することもできます)。

于 2013-01-24T21:10:32.867 に答える