如何在SQL Server中动态创建十进制变量

时间:2015-12-19 11:53:16

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

--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中创建一个十进制变量,其动作取自某个变量,我已经尝试了上面的代码片段,但它失败并出现错误

  

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

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

修改

我想要这样的要求,因为我必须克服下面代码段中遇到的问题:

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

现在上面的代码段输出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的进动和缩放将解决问题,但在我的项目中它会导致很大的架构变化,因此无法完成。< / p>

1 个答案:

答案 0 :(得分:0)

最简单的方法是转而使用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*/