如何使用正确的十进制/ $结果转换计算列

gen*_*eek 4 sql sql-server sql-server-2008

我在sql server 2008中有以下计算列

[Total] AS  CAST ( ((val1/(1000)) * [val2]) AS DECIMAL(18,2))  PERSISTED,
Run Code Online (Sandbox Code Playgroud)

当val1 = 862500且val2 = 8时,计算值= 6896.00

我需要它是十进制/金钱,其中(862500/1000)*8 = 6900.00(不是6896.00).

Ale*_*x_L 5

BOL说:

警告:当您使用+, - ,*,/或%算术运算符执行int,smallint,tinyint或bigint常量值到float,real,decimal或numeric数据类型的隐式或显式转换时,规则SQL Server在计算数据类型时适用,并且表达式结果的精度因查询是否自动参数化而不同.

因此,查询中的类似表达式有时会产生不同的结果.当查询不是自动参数化时,常量值首先转换为数字,其精度只要大到足以保存常量的值,然后再转换为指定的数据类型.例如,常数值1被转换为数字(1,0),并且常数值250被转换为数字(3,0).

当查询是自动参数化时,常量值总是在转换为最终数据类型之前转换为数字(10,0).当涉及/运算符时,不仅结果类型的精度在类似查询中不同,但结果值也可能不同.例如,包含表达式SELECT CAST(1.0/7 AS float)的自动参数化查询的结果值将不同于未自动参数化的同一查询的结果值,因为自动参​​数化查询的结果将被截断以适合到数字(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
Run Code Online (Sandbox Code Playgroud)