T-SQL中十进制计算列的精度

时间:2019-11-19 05:31:37

标签: sql-server tsql decimal calculated-columns

我们以前在数据库中有以下字段:

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)

1 个答案:

答案 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]');

enter image description here

为什么?检查在对十进制值执行操作时如何设置小数精度的formula

enter image description here

所以,我们有:

[A] DECIMAL(19,2)
[B] DECIMAL(19,5)
[C] AS [A] * [B]

,公式为:

p1 + p2 + 1 => 2 + 5 + 1 => 7
s1 + s2 => 19 + 19 = > 38

但是:

  

在乘法和除法运算中,我们需要精度-比例   存储结果不可分割部分的位置。规模可能是   减少使用以下规则:

     
      
  1. 如果整数部分小于32,则结果比例会减小为min(scale,38-(precision-scale)),因为   不能大于38-(精度标度)。结果可能会四舍五入   在这种情况下。
  2.   
  3. 如果比例小于6,并且整数部分大于32,则不会更改比例。在这种情况下,可能会出现溢出错误   如果不适合小数(38,小数位数)
  4.   
  5. 如果刻度大于6并且整数部分大于32,则刻度将设置为6。在这种情况下,整数部分和   小数位数将减少,结果类型为小数(38,6)。结果   可能会四舍五入到小数点后六位,否则将出现溢出错误   如果整数部分不能容纳32位数字,则抛出该数字。
  6.   

,根据规则3,小数位数上限为6,您将得到DECIMAL(38,6)。这就是为什么您需要将结果显式转换为目标十进制类型的原因。

相关问题