首页 > 解决方案 > 如何使用变量动态设置小数精度

问题描述

我正在尝试在存储过程中动态设置小数精度,如下所示

 DECLARE @precison int
 select @precison = [ConfigValue] from [TestData] WHERE ConfigName = 'Precision'
 select CAST( (10.56/10.25)as decimal(18, @precision))

如果精度为 '2' SP 应返回 '1.03' 作为结果。但是强制转换函数不接受 @precision 参数作为变量。我想从存储过程中以十进制本身返回数据。我如何在 SQL Server 中实现这一点

标签: sqlsql-serverdatabasereporting-servicesdecimal

解决方案


这里的问题是你的想法完全错误。数据的格式化应该在表示层(在这种情况下为 SSRS)而不是RDBMS 中处理。尽管您可以动态声明具有动态精度或比例的内容,但您必须使用动态 SQL,这可能会使问题严重过度复杂化,并且可能会破坏您的 SSRS 报告,除非您了解如何将动态语句成功地实现到 SSRS 中。

相反,您应该使用表示层来确定格式。这在 SSRS 中并不是特别容易,但也不难。假设您的SSRS报告中有一个参数 ,Precision定义为Integer. 我还将使用来自以下 SQL 的基本数据集:

SELECT d
FROM (VALUES(10),(10.1),(10.12),(10.123),(10.1234))V(d);

这意味着您可能有一个看起来有点像这样的报告:

在此处输入图像描述

右键单击空白区域,然后选择报告属性并转到代码窗格。然后输入以下代码:

Public Function DynamicPrecision(ByVal Precision AS Integer) AS String

    Dim I AS Integer
    If Precision = 0
        DynamicPrecision = "#,#"
    Else
        DynamicPrecision = "#,#."
        For I = 1 to Precision
            DynamicPrecision = DynamicPrecision & "0"
        Next I
    End If
End Function

现在单击您想要动态精度的单元格(或按住控件并单击单元格),然后按 F4 打开属性窗格。在属性窗格中进行精细格式化,然后下拉并选择“«表达式»”。然后输入以下表达式:

=Code.DynamicPrecision(Parameters!Precision.Value)

然后,您的单元格将动态格式化为该精度。

因此,对于024,数据将如下所示:

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述


推荐阅读