如何使用变量动态设置小数精度

How to set decimal precision dynamically using a variable

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

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

如果精度为“2”,SP 应该 return“1.03”,因为 result.But 转换函数不接受 @precision 参数作为变量。我想 return 数据本身作为小数从存储的 procedure.How 我可以在 SQL 服务器

中实现吗

舍入,然后格式化。例如

 DECLARE @precison int = 2
 select format(round( (10.56/10.25),  @precison),'#,####.##')

或者只是 ROUND 并让 front-end 选择显示格式。

这里的问题是你的想法完全错误。数据格式应在表示层(在本例中为 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);

这意味着您的报告可能有点像这样:

右键单击空白 space,然后 select 报告属性并转到“代码”窗格。然后输入以下代码:

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

现在单击要启用动态精度的单元格(或按住 control 并单击单元格),然后按 F4 打开属性窗格。 Fine Format 在 Properties Pane 中然后下拉 select "«expression»"。然后输入以下表达式:

=Code.DynamicPrecision(Parameters!Precision.Value)

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

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