如何在函数或存储过程中对公式文本进行计算 RT,在某字段中存储着如 '1+2*3+5+13-3+3'之类的+-*/的二则运算的文本,在程序中直接使用select 1+2*3+5+13-3+3 即可返回计算结果,现在函数中取出的运算公式为文本,如何进行计算并赋值到变量呢?不胜感激 ! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 DECLARE @i nVARCHAR(100)='1+2*3+5+13-3+3'DECLARE @sql NVARCHAR(100)SET @sql = 'select '+ @iEXEC sp_executesql @sql--25 Msg 557, Level 16, State 2, Procedure CaiJianShiJian, Line 50只有函数和扩展存储过程才能从函数内部执行。 declare @str varchar(1000)set @str = '1+2*3+5+13-3+3'set @str = 'select ' + @strexec(@str)/********25楼主不要写函数了,不支持动态SQL,要写储存过程! LZ 把上述代码建立个函数或者存储过程然后再引用即可。TRY 在函数中,可以用xml DOM或ScriptControl来计算.网上源码大把的. 一样调用就可以,做一个返回的存储过程,例如 get_pro (@var varchar(20),@re int output)函数里获取的时候可以 declare @get intexec get_pro '1+2*3+5+13-3+3',@get outputselect @get --> Title : MSSQL計算表達式的值常見解決方案--> Author : wufeng4552--> Date : 2009-11-25 08:15:08if object_id('[tb]') is not null drop table [tb]gocreate table [tb] (ID int,val nvarchar(14))insert into [tb]select 1,'1*5' union allselect 2,'1+5' union allselect 3,'1.0/5' union allselect 4,'1/5' union allselect 5,'2*5+3' union allselect 6,'(8-5)*3'--方法1 動態T-SQLdeclare @sql varchar(8000)set @sql=''select @sql=@sql+'select ID='+ltrim(ID)+', val='+val+' union all ' from tbset @sql=left(@sql,len(@sql)-10)exec(@sql)-->查詢結果/*ID val----------- ---------------------------------------1 5.0000002 6.0000003 0.2000004 0.0000005 13.0000006 9.000000(6 個資料列受到影響)*/--方法2 游標declare @t table(ID int, val dec(18,2))declare @s varchar(50),@id int declare cur cursor for select ID,val from tbopen cur fetch next from cur into @id,@swhile @@fetch_status=0begin insert @t exec('select '+@ID+','+@s) fetch next from cur into @id,@sendclose curdeallocate cur select * from @t/*ID val----------- ---------------------------------------1 5.002 6.003 0.204 0.005 13.006 9.00(6 個資料列受到影響)*/--方法3 函數if object_id('f_calc')is not null drop function f_calcgocreate function f_calc(@str varchar(1000)--要计 oa的表达 |?)returns sql_variantasbegindeclare @re sql_variantdeclare @err int,@src varchar(255),@desc varchar(255)declare @obj intexec @err=sp_oacreate 'MSScriptControl.ScriptControl',@obj outif @err<>0 goto lb_errexec @err=sp_oasetproperty @obj,'Language','vbscript'if @err<>0 goto lb_errexec @err=sp_oamethod @obj,'Eval',@re out,@strif @err=0 return(@re)lb_err:exec sp_oageterrorinfo NULL, @src out, @desc out declare @errb varbinary(4),@s varchar(20)set @errb=cast(@err as varbinary(4))exec master..xp_varbintohexstr @errb,@s outreturn(N'错誤号 '+@s+char(13)+N'错誤源: '+@src+char(13)+N'错误描述: '+@desc)endgo--以上方法要啟用OLE Automation Procedures 方法如下sp_configure 'show advanced options', 1;GORECONFIGURE;GOsp_configure 'Ole Automation Procedures', 1;GORECONFIGURE;GOselect ID, dbo.f_calc(val)valfrom tb/*ID val----------- --------------1 52 63 .24 .25 136 9(6 個資料列受到影響)*/本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wufeng4552/archive/2009/11/25/4868138.aspx sqlserver 分组 统计 请ai_li7758521、sql77、lingling1989r进来接分 这样的sql怎么写? 急,一条SQL语句!!!!! SQL Agent里面使用CmdExec的命令格式 请问这里的@@代表什么意思,在线等待 Sql Server 中交集查询问题 请大家帮忙看看这个问题 关于UNIX下ORACLE的问题 请问SQL Server 2008 Express Edition(免费版)有用户和并发访问限制吗? 局域网通过IP访问本机Sql Server 2000 失败。 多个控件共用一个数据库连接的问题
DECLARE @sql NVARCHAR(100)SET @sql = 'select '+ @i
EXEC sp_executesql @sql--25
只有函数和扩展存储过程才能从函数内部执行。
declare @str varchar(1000)
set @str = '1+2*3+5+13-3+3'
set @str = 'select ' + @str
exec(@str)/********25
楼主不要写函数了,不支持动态SQL,要写储存过程!
LZ 把上述代码建立个函数或者存储过程然后再引用即可。
TRY
exec get_pro '1+2*3+5+13-3+3',@get output
select @get
----------- ---------------------------------------
1 5.00
2 6.00
3 0.20
4 0.00
5 13.00
6 9.00(6 個資料列受到影響)*/--方法3 函數if object_id('f_calc')is not null drop function f_calcgocreate function f_calc(@str varchar(1000)--要计 oa的表达 |?)returns sql_variantasbegindeclare @re sql_variantdeclare @err int,@src varchar(255),@desc varchar(255)declare @obj intexec @err=sp_oacreate 'MSScriptControl.ScriptControl',@obj outif @err<>0 goto lb_errexec @err=sp_oasetproperty @obj,'Language','vbscript'if @err<>0 goto lb_errexec @err=sp_oamethod @obj,'Eval',@re out,@strif @err=0 return(@re)lb_err:exec sp_oageterrorinfo NULL, @src out, @desc out declare @errb varbinary(4),@s varchar(20)set @errb=cast(@err as varbinary(4))exec master..xp_varbintohexstr @errb,@s outreturn(N'错誤号 '+@s+char(13)+N'错誤源: '+@src+char(13)+N'错误描述: '+@desc)endgo--以上方法要啟用OLE Automation Procedures 方法如下sp_configure 'show advanced options', 1;GORECONFIGURE;GOsp_configure 'Ole Automation Procedures', 1;GORECONFIGURE;GOselect ID, dbo.f_calc(val)valfrom tb/*ID val----------- --------------1 52 63 .24 .25 136 9(6 個資料列受到影響)*/本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wufeng4552/archive/2009/11/25/4868138.aspx