SQL Server十进制变量赋值?

Bal*_*alt 8 sql t-sql types casting sql-server-2012

我正在尝试编写一个存储过程,并且我得到了意外的除以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'
Run Code Online (Sandbox Code Playgroud)

导致这个?

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

    (1 row(s) affected)

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

    (1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)

p.s*_*w.g 11

问题是您没有为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
Run Code Online (Sandbox Code Playgroud)

  • 我可以看到OP的混乱,因为除了两个小数而没有比例*会*显示小数位 (5认同)