使用动态变量舍入小数值

Rounding a decimal value with dynamic variable

我需要在 SQL 函数中根据 table B 中的另一列舍入 table A 中的列值。

DECLARE @currencyround INT

SELECT @currencyround = ISNULL(currencyround, 2) 
FROM dbo.PRTL_currencySettings

当我像下面这样直接将 @currencyround 的值放入查询中时,它工作正常:

SELECT
    CAST(POS.BALANCE AS DECIMAL(18, 2)) AS DBAmount
FROM 
    dbo.POS_SALES POS

当我像下面这样输入 @currencyround 的值时,它显示错误:

Incorrect syntax near '@currencyround'.

SELECT
    CAST(POS.BALANCE AS DECIMAL(18, @currencyround)) AS DBAmount
FROM 
    dbo.POS_SALES POS  

你有什么不明白的?类型定义不允许变量。您可以使用动态 SQL 来做到这一点,但这似乎有些矫枉过正。

如果您关心变量的输出方式,请使用 str()format() 创建您想要的格式。

如果您需要特定的元数据,您可以使用动态 SQL:

DECLARE @currencyround int;
SELECT @currencyround=ISNULL(currencyround,2) FROM dbo.PRTL_currencySettings;

DECLARE @sql NVARCHAR(MAX) = 
N'select CAST(POS.BALANCE AS DECIMAL(18,<currencyround>)) AS DBAmount
FROM dbo.POS_SALES POS';

SET @sql = REPLACE(@sql, '<currencyround>', @currencyround);

EXEC(@sql);

但我个人不会写这样的代码。我宁愿在应用层格式化数字。

如果你需要四舍五入值,那么这个怎么样:

ROUND(POS.BALANCE, @currencyround)