我们以前在数据库中有以下字段:
FieldA decimal(19, 2)
我们已将字段更改为计算字段:
ALTER TABLE MyTable
ADD FieldA AS FieldB * FieldC
位置:
FieldB decimal(19, 2)
FieldC decimal(19, 5)
生成的新FieldA
:
FieldA (Computed, decimal(38,6))
旧版代码使用FieldA
并假设它有两个小数。因此,字符串翻译不应用格式。结果,在新定义下,FieldA
的显示为六个小数,这是不可接受的。
是否可以修改计算列的精度(例如,保持原始类型decimal(19, 2)
),还是需要向所有显示该值的位置添加适当的格式?
舍入无效:
ADD FieldA AS ROUND(FieldB * FieldC, 2)
答案 0 :(得分:1)
尝试一下:
CREATE TABLE [dbo].[TEST]
(
[A] DECIMAL(19,2)
,[B] DECIMAL(19,5)
,[C] AS [A] * [B]
,[D] AS CAST([A] * [B] AS DECIMAL(19,2))
);
GO
SELECT *
FROM [sys].[columns]
WHERE [object_id] = OBJECT_ID('[dbo].[TEST]');
为什么?检查在对十进制值执行操作时如何设置小数精度的formula。
所以,我们有:
[A] DECIMAL(19,2)
[B] DECIMAL(19,5)
[C] AS [A] * [B]
,公式为:
p1 + p2 + 1 => 2 + 5 + 1 => 7
s1 + s2 => 19 + 19 = > 38
但是:
在乘法和除法运算中,我们需要精度-比例 存储结果不可分割部分的位置。规模可能是 减少使用以下规则:
- 如果整数部分小于32,则结果比例会减小为min(scale,38-(precision-scale)),因为 不能大于38-(精度标度)。结果可能会四舍五入 在这种情况下。
- 如果比例小于6,并且整数部分大于32,则不会更改比例。在这种情况下,可能会出现溢出错误 如果不适合小数(38,小数位数)
- 如果刻度大于6并且整数部分大于32,则刻度将设置为6。在这种情况下,整数部分和 小数位数将减少,结果类型为小数(38,6)。结果 可能会四舍五入到小数点后六位,否则将出现溢出错误 如果整数部分不能容纳32位数字,则抛出该数字。
,根据规则3
,小数位数上限为6
,您将得到DECIMAL(38,6)
。这就是为什么您需要将结果显式转换为目标十进制类型的原因。