如何计算 SQL Server 中 nvarchar 变量中保存的数学表达式

Mar*_*iam 5 sql sql-server mathematical-expressions

我想计算保存在 sql server 变量中的数学表达式

我用谷歌搜索了很多,找到了 3 个解决方案,但不适用于我的场景

1-此解决方案无法在函数内执行,但我需要在函数内执行

declare @expression nvarchar(max)
set @expression = '2*3*100'

declare @sql nvarchar(max)
set @sql = 'select @result = ' + @expression

declare @result int
exec sp_executesql @sql, N'@result int output', @result = @result out

select @result
Run Code Online (Sandbox Code Playgroud)

2-这不能保存到变量中,但我需要将结果存储到变量中

DECLARE @LocalVariable VARCHAR(32);
SET @LocalVariable = '2*3*100';
EXEC('SELECT ' + @LocalVariable);
Run Code Online (Sandbox Code Playgroud)

3-我找到的最后一个解决方案给了我一个错误

DECLARE @x xml 
DECLARE @v decimal(20,4) 
SET @x = '' 
DECLARE @calculatedDataString nvarchar(1000) = '(1 div 100)*((118 div 100)*300.000000)' 
SET @v= @x.value('sql:variable("@calculatedDataString")', 'decimal(20,4)') 
SELECT @v 
Run Code Online (Sandbox Code Playgroud)

错误是

Msg 8114, Level 16, State 5, Line 5
Error converting data type nvarchar to numeric.
Run Code Online (Sandbox Code Playgroud)

请指教

Joh*_*tti 3

也许这可能有帮助。

下面将计算一系列表达式,将结果保存到#temp 表中。从那里您可以将各个结果存储到变量中

这是一个大幅缩小的版本。完整的模型是为宏观替换而构建的(即计算多个数据集的一系列或财务比率)

如果您提供更强大的用例,也许我可以提供进一步的帮助

例子

Declare @Expression table (ID int,Expression varchar(max))
Insert Into @Expression values
 (1,'(1/100.0)*((118/100.0)*300.00000)')           -- Simple Calculation
,(2,'datediff(DD,''2016-07-29'',GetDate())')       -- System Functions
,(3,'(Select max(name) from master..spt_values)')  -- Select Value From Table
,(4,'convert(date,GetDate())')                     -- Get Today's Date


IF OBJECT_ID(N'tempdb..#Results') IS NOT NULL
BEGIN
    DROP TABLE #Results
END
Create table #Results (ID int,Value varchar(max))

Declare @SQL varchar(max)=''
Select  @SQL = @SQL+concat(',(',ID,',cast(',Expression,' as varchar(max)))') From @Expression 
Select  @SQL = 'Insert Into #Results Select * From ('+Stuff(@SQL,1,1,'values')+') N(ID,Value)'
Exec(@SQL)

Select * From #Results

Declare @Var decimal(10,4) = (Select Value From #Results where ID=1)
Select @Var  -- 3.5400
Run Code Online (Sandbox Code Playgroud)

临时表

ID  Value
1   3.54000000000000000
2   243
3   YES OR NO
4   2017-03-29
Run Code Online (Sandbox Code Playgroud)