--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>
答案 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*/