首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Server中动态创建十进制变量

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

Stack Overflow用户
提问于 2015-12-19 11:53:16
回答 2查看 4K关注 0票数 1
代码语言:javascript
运行
复制
--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”附近的不正确语法。

有什么可行的办法来做这样的事吗?

编辑:

我想要这样的要求,因为我必须克服在下面的片段中所面临的问题:

代码语言:javascript
运行
复制
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)之前,然后执行乘法以获得正确的输出。

代码语言:javascript
运行
复制
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

注意:我知道减少原始变量的进动和规模会解决这个问题,但是在我的项目中,它会导致很大的架构变化,因此无法完成。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-19 13:17:08

最简单的方法是将其转换为float

代码语言:javascript
运行
复制
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的所有可能性。

代码语言:javascript
运行
复制
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*/
票数 1
EN

Stack Overflow用户

发布于 2015-12-19 12:14:27

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

所以:

代码语言:javascript
运行
复制
declare @temp decimal(38, 10);

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

如果要对表中的列执行此操作,甚至可以将表达式设置为计算列。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34370410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档