一尘不染

SQL Server十进制变量分配?

sql

我正在尝试编写一个存储过程,但是我得到了意外的除以0的异常。

我将其范围缩小到以下示例。

为什么在世界上这样做:

    declare @A decimal;
    declare @B decimal;
    declare @C decimal;

    set @A = 4;
    set @B = 9;
    set @C = @A/@B

    select @A/@B as 'Expected'
    select @C as 'Wut'

结果呢?

    Expected
    ---------------------------------------
    0.4444444444444444444

    (1 row(s) affected)

    Wut
    ---------------------------------------
    0

    (1 row(s) affected)

阅读 139

收藏
2021-05-16

共1个答案

一尘不染

问题是您尚未为decimal类型指定比例。从MSDN

s(比例)

将存储在小数点右边的小数位数。从p中减去此数字可确定小数点左边的最大位数。小数位数必须是0到p之间的值。仅在指定精度的情况下才能指定比例。
默认比例为0 ; 因此,0 <= s <= p。

因此,当您尝试存储@A/@B回时@C,小数部分会被截断。

注意:

declare @A decimal(18, 3);
declare @B decimal(18, 3);
declare @C decimal(18, 3);

set @A = 4;
set @B = 9;
set @C = @A/@B

select @A/@B -- 0.44444444444444444444
select @C    -- 0.444
2021-05-16