【问题标题】:How to cast computed column with correct decimal/$ result如何使用正确的小数/$结果转换计算列
【发布时间】:2011-10-18 12:10:37
【问题描述】:

我在 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)。

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    BOL 说:

    注意:当您使用 +、-、*、/ 或 % 算术运算符时 执行 int、smallint、tinyint 或 浮点数、实数、十进制或数字数据的 bigint 常量值 类型,SQL Server 在计算数据时应用的规则 表达式结果的类型和精度取决于 查询是否自动参数化。

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

    当查询被自动参数化时,常量值总是 在转换为最终数据类型之前转换为数字 (10, 0)。 当涉及 / 运算符时,不仅可以将结果类型的 相似查询之间的精度不同,但结果值可以 也不同。例如,自动参数化的结果值 包含表达式 SELECT CAST (1.0 / 7 AS float) 的查询将 与不是相同查询的结果值不同 自动参数化,因为自动参​​数化查询的结果 将被截断以适合数字 (10, 0) 数据类型。更多 有关参数化查询的信息,请参阅简单参数化。

    所以,你需要将 [val1]、1000 和 [val2] 转换为浮点类型:

    [Total] AS CAST ( ((CAST ([val1] as float)/CAST (1000 as float)) * CAST ([val2] as float)) AS DECIMAL(18,2)) PERSISTED
    

    【讨论】:

      【解决方案2】:

      我想出了这个:

      SELECT  (cast(862500 as float)/cast(1000 as float) ) * 8  
      
      returns 6900
      

      要保留小数点后两位......

      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,
      

      【讨论】:

        猜你喜欢
        • 2018-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-02
        • 2016-01-01
        • 2014-10-04
        • 2021-08-08
        • 1970-01-01
        相关资源
        最近更新 更多