--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 ) 我想在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注意:我知道减少原始变量的进动和规模会解决这个问题,但是在我的项目中,它会导致很大的架构变化,因此无法完成。
发布于 2015-12-19 13:17:08
最简单的方法是将其转换为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*/发布于 2015-12-19 12:14:27
我看不出有什么明显的理由来创建一个具有动态精度或scal的十进制值。一个解决办法是创建一个“足够大”的十进制值。然后,您可以使用str()将其输出到您喜欢的任何精度。
所以:
declare @temp decimal(38, 10);
select str(@temp, @count + 10 + 1);如果要对表中的列执行此操作,甚至可以将表达式设置为计算列。
https://stackoverflow.com/questions/34370410
复制相似问题