【问题标题】:How to create decimal variable dynamically in SQL Server如何在 SQL Server 中动态创建十进制变量
【发布时间】:2016-03-26 00:51:39
【问题描述】:
--Actually this is calculated based on some logic but here
-- I have hard coded it to keep it simple.    
DECLARE @Count INT = 4  

--To accommodate Precision + Scale correctly
SET @Count = @Count + 10 

-- I want something like this
DECLARE @Temp DECIMAL( @Count , 10 ) 

我想在 SQL Server 中创建一个十进制变量,其 Precession 是从某个变量动态获取的,我已经尝试了上面的 sn-p 但它失败并出现错误

''@Count' 附近的语法不正确。'

是否有任何可能的解决方案来做这样的事情?

编辑:

我想要这样的要求,因为我必须克服下面 sn-p 中面临的问题:

DECLARE @Var1 DECIMAL(32, 10) = 0.0000001700
DECLARE @Var2 DECIMAL(32, 10) = 1.0000000000

Select CAST( (@Var1*@Var2) AS DECIMAL(32,10) ) --This Outputs 0.0000000000

现在上面的 sn-p 输出 0.0000000000 而不是 0.0000001700,因此为了解决这个问题,我想创建一个 新变量,其进动将是 @var2 的小数点前位数 @newVar Decimal(11,10) 然后执行乘法得到正确的输出。

DECLARE @Var2 DECIMAL(32, 10)= 1.0000000000
DECLARE @newVar DECIMAL( 11 , 10 )= @Var2 -- here 11 is dynamically calculated, my original question

DECLARE @Var1 DECIMAL(32, 10)= 0.0000001700

Select CAST((@Var1*@newVar) AS DECIMAL(32,10)) --This correctly outputs 0.0000001700

注意:我知道减少原始变量@var1 and @var2的进动和规模会解决问题,但在我的项目中会导致架构发生较大的变化,因此无法做到。

【问题讨论】:

  • 仅通过创建整个脚本来声明和使用动态 SQL 的变量。为什么需要这个?

标签: sql sql-server database sql-server-2008 sql-server-2005


【解决方案1】:

我看不出有什么明显的理由要创建具有动态精度或刻度的十进制值。一种解决方法是创建一个“足够大”的十进制值。然后您可以使用str() 将其输出为您喜欢的任何精度。

所以:

declare @temp decimal(38, 10);

select str(@temp, @count + 10 + 1);

如果您对表中的列执行此操作,您甚至可以使表达式成为计算列。

【讨论】:

    【解决方案2】:

    最简单的方法是转换为 float

    DECLARE @Var1 DECIMAL(32, 10) = 0.0000001700;
    DECLARE @Var2 DECIMAL(32, 10) = 1.0000000000;
    
    DECLARE @Result DECIMAL(38, 10) = CAST(@Var1 AS FLOAT) * CAST(@Var2 AS FLOAT);
    SELECT @Result /*0.0000001700*/
    

    如果由于某种原因不合适,那么下一个最简单的方法是动态 SQL,尽管它可以使用 253 分支 CASE 语句静态完成所有 (22* 23)/2 的可能性。

    DECLARE @Var1 DECIMAL(32, 10) = 0.0000001700;
    DECLARE @Var2 DECIMAL(32, 10) = 1.0000000000;
    
    DECLARE @Result DECIMAL(38, 10);
    
    DECLARE @DynSQl NVARCHAR(MAX) = '
    SET @Result = CAST(@Var1 AS DECIMAL(' + LTRIM(10 + LEN(ABS(CAST(FLOOR(@Var1) AS INT)))) + ',10)) * CAST(@Var2 AS DECIMAL(' + LTRIM(10 + LEN(ABS(CAST(FLOOR(@Var2) AS INT)))) + ',10)) 
    ';
    
    EXEC sp_executesql
      @DynSQl,
      N'@Var1 DECIMAL(32, 10), @Var2 DECIMAL(32, 10), @Result DECIMAL(38, 10) OUTPUT',
      @Var1 = @Var1,
      @Var2 = @Var2,
      @Result = @Result OUTPUT;
    
    SELECT @Result; /*0.0000001700*/
    

    【讨论】:

      猜你喜欢
      • 2014-11-25
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多