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)
| 归档时间: |
|
| 查看次数: |
15205 次 |
| 最近记录: |