我在sql server 2008中有以下计算列
[Total] AS CAST ( ((val1/(1000)) * [val2]) AS DECIMAL(18,2)) PERSISTED,
当val1 = 862500且val2 = 8时,计算值= 6896.00
我需要它为十进制/金钱,其中(862500/1000)* 8 = 6900.00(不是6896.00)。
答案 0 :(得分:5)
BOL说:
警告:使用+, - ,*,/或%算术运算符时 执行int,smallint,tinyint或者的隐式或显式转换 bigint常量值为float,real,decimal或numeric数据 types,SQL Server在计算数据时应用的规则 表达式结果的类型和精度因而不同 查询是否自动参数化。
因此,查询中的类似表达式有时会产生 不同的结果。当查询不是自动参数化时,常量 value首先转换为numeric,其精度很大 足以在转换为之前保持常量的值 指定的数据类型。例如,将常数值1转换为 数字(1,0),常数值250转换为数字(3, 0)。
当查询自动参数化时,常量值始终为 在转换为最终数据类型之前转换为数字(10,0)。 当涉及/运算符时,不仅结果类型可以 类似查询的精度不同,但结果值可以 也有所不同。例如,自动参数化的结果值 查询包含表达式SELECT CAST(1.0 / 7 AS float)将 与不相同的查询的结果值不同 autoparameterized,因为自动参数化查询的结果 将被截断以适合数字(10,0)数据类型。更多 有关参数化查询的信息,请参阅简单参数化。
因此,您需要将[val1],1000和[val2]转换为float类型:
[Total] AS CAST ( ((CAST ([val1] as float)/CAST (1000 as float)) * CAST ([val2] as float)) AS DECIMAL(18,2)) PERSISTED
答案 1 :(得分:4)
我想出了这个:
SELECT (cast(862500 as float)/cast(1000 as float) ) * 8
returns 6900
使它成为2位小数....
SELECT cast((cast(862500 as float)/cast(1000 as float) ) * 8 as decimal(18,2))
returns 6900.00
您的具体案例:
[Total] AS CAST ( ((cast(val1 as float)/(1000)) * cast([val2] as float)) AS DECIMAL(18,2)) PERSISTED,