一个字符串的问题,求教

叶子 2008-03-28 12:42:17


/*以下可以直接用*/
declare @centers nvarchar(2000)
declare @sql varchar(2000)
set @centers='17462.72/22.88*35.05+(0.0+17265.60)+29149.12';
select @centers --结果:17462.72/22.88*35.05+(0.0+17265.60)+29149.12
set @sql='SELECT ROUND('+@centers+', 2)'
exec(@sql)--结果:73165.960000000

--我想把它放到函数里,返回73165.96
--但是函数里不能用exec

/*我转成以下sql代码*/
declare @centers nvarchar(2000)
declare @sql varchar(2000)
set @centers='17462.72/22.88*35.05+(0.0+17265.60)+29149.12';
select @centers --结果:17462.72/22.88*35.05+(0.0+17265.60)+29149.12
set @sql=ROUND(@centers, 2); --错误:Error converting data type nvarchar to float.
select @sql

--拼串执行可以,直接执行就不行
--寻找个解决方案,谢谢大家
--注:我要把它放到函数里,函数里有很多东西不能用。
...全文
613 66 打赏 收藏 转发到动态 举报
写回复
用AI写文章
66 条回复
切换为时间正序
请发表友善的回复…
发表回复
nextflying 2008-04-01
  • 打赏
  • 举报
回复
写个函数调用存储过程 , 存储过程中实现运算
cson_cson 2008-04-01
  • 打赏
  • 举报
回复
给你找了个,转成SQL的就行了。
http://www.yuanma.org/data/2007/0402/article_2480.htm
cson_cson 2008-04-01
  • 打赏
  • 举报
回复
如果只是+-×/()的话,可以自己写个前置表达式的函数进行计算呀。
如果前置表达式不会写,网上搜一下,太多了。
fcuandy 2008-04-01
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 maco_wang 的回复:]
Msg 15281, Level 16, State 1, Line 5
SQL Server blocked access to procedure 'sys.sp_OACreate' of component 'Ole Automation Procedures' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Ole Automation Procedures' …
[/Quote]

sql2005 外围应用配置器>功能外围应用配置器>ole自动化>启用
-狙击手- 2008-04-01
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 maco_wang 的回复:]
Cannot add rows to sysdepends for the current object because it depends on the missing object 'master..xp_varbintohexstr'. The object will still be created.

To 无枪狙击手
我创建函数报错呀?

//附加
我记得函数里不能用exec的,
Invalid use of side-effecting or time-dependent operator in 'EXECUTE STRING' s.
怎么你就可以用?
[/Quote]

你master没有这个过程xp_varbintohexstr'?
叶子 2008-04-01
  • 打赏
  • 举报
回复
To
happyflystone
无枪狙击手
等级:
怎么调用也有问题?
我需要配置什么吗?
谢谢

Msg 15281, Level 16, State 1, Line 5
SQL Server blocked access to procedure 'sys.sp_OACreate' of component 'Ole Automation Procedures' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Ole Automation Procedures' by using sp_configure. For more information about enabling 'Ole Automation Procedures', see "Surface Area Configuration" in SQL Server Books Online.
叶子 2008-04-01
  • 打赏
  • 举报
回复
To
yananguo_1985
SQL
等级:
我以前说的是@centers为字符串,同样谢谢你
叶子 2008-04-01
  • 打赏
  • 举报
回复
Cannot add rows to sysdepends for the current object because it depends on the missing object 'master..xp_varbintohexstr'. The object will still be created.

To 无枪狙击手
我创建函数报错呀?

//附加
我记得函数里不能用exec的,
Invalid use of side-effecting or time-dependent operator in 'EXECUTE STRING' s.
怎么你就可以用?
yananguo_1985 2008-04-01
  • 打赏
  • 举报
回复
declare @centers nvarchar(2000)
declare @sql varchar(2000)
set @centers=17462.72/22.88*35.05+(0.0+17265.60)+29149.12;
select @centers --结果:73165.958460460
set @sql=round(cast(@centers as decimal(9,2)),2)
select @sql --结果:73165.96
yananguo_1985 2008-04-01
  • 打赏
  • 举报
回复
declare @centers nvarchar(2000)
declare @sql varchar(2000)
set @centers=17462.72/22.88*35.05+(0.0+17265.60)+29149.12;
select @centers --结果:17462.72/22.88*35.05+(0.0+17265.60)+29149.12
set @sql=round(cast(@centers as decimal(9,2)),2)
select @sql
-狙击手- 2008-04-01
  • 打赏
  • 举报
回复
--调用

declare @centers nvarchar(2000)
declare @sql varchar(2000)
set @centers='17462.72/22.88*35.05+(0.0+17265.60)+29149.12'

select
cast(dbo.f_calc(@centers) as numeric(23,2)) as col


drop function f_calc



/*
col
--------------------
73165.96

(所影响的行数为 1 行)
*/
-狙击手- 2008-04-01
  • 打赏
  • 举报
回复
create function f_calc(
@str varchar(1000)--要计算的表达式
)returns sql_variant
as
begin
declare @re sql_variant

declare @err int,@src varchar(255),@desc varchar(255)
declare @obj int

exec @err=sp_oacreate 'MSScriptControl.ScriptControl',@obj out
if @err<>0 goto lb_err

exec @err=sp_oasetproperty @obj,'Language','vbscript'
if @err<>0 goto lb_err

exec @err=sp_oamethod @obj,'Eval',@re out,@str
if @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 out
return('错误号: '+@s+char(13)+'错误源: '+@src+char(13)+'错误描述: '+@desc)
end
go

--调用

declare @centers nvarchar(2000)
declare @sql varchar(2000)
set @centers='17462.72/22.88*35.05+(0.0+17265.60)+29149.12'

select
dbo.f_calc(@centers) as col


drop function f_calc



/*
col
--------------------
73165.9584615385

(所影响的行数为 1 行)
*/
-狙击手- 2008-04-01
  • 打赏
  • 举报
回复
create function f_calc(
@str varchar(1000)--要计算的表达式
)returns sql_variant
as
begin
declare @re sql_variant

declare @err int,@src varchar(255),@desc varchar(255)
declare @obj int

exec @err=sp_oacreate 'MSScriptControl.ScriptControl',@obj out
if @err<>0 goto lb_err

exec @err=sp_oasetproperty @obj,'Language','vbscript'
if @err<>0 goto lb_err

exec @err=sp_oamethod @obj,'Eval',@re out,@str
if @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 out
return('错误号: '+@s+char(13)+'错误源: '+@src+char(13)+'错误描述: '+@desc)
end
go

--调用

declare @centers nvarchar(2000)
declare @sql varchar(2000)
set @centers='17462.72/22.88*35.05+(0.0+17265.60)+29149.12'

select
dbo.f_calc(replace(replace(@centers,'*','*'),'/','/')) as col


drop function f_calc



/*
col
--------------------
73165.9584615385

(所影响的行数为 1 行)
*/
fcuandy 2008-04-01
  • 打赏
  • 举报
回复
当然,sql中可以利用xslt执行得到结果,那么c#中当然也可以.
fcuandy 2008-04-01
  • 打赏
  • 举报
回复
再给你个,sql2005下启和clr,然后利用c#写函数布署到sql2005.

1,打开vs2005,新建项目,语言选择c#(当然你可以选择自己合适的语言),展开c#节点,选择数据库,自己选择连接选项,然后确定.
我选择 机器名\sqlexpress, 库为test. windows身份验证
2,选中资源管理器里的当前项目,然后在VS IDE的项目菜单中选择新建用户自定义函数
3,命名为myEVAL.cs
代码如下:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Xml;
using System.Xml.XPath;

public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString myEVAL(string str)
{
XmlDocument xd = new XmlDocument();
XPathNavigator nav = xd.CreateNavigator();
return nav.Evaluate(str).ToString();
}
};


4,在解决方案上右击部署解决方案。

5,打开sql2005 management studio
展开 test>可编程性>函数>标量值函数>看到 dbo.myEVAL.已发布成功

新建查询:
SELECT dbo.myEVAL('1+2+3')
/*6*/




至于clr里执行eval有多种方式,最简单的是使用j#,因为它本身提供了这个.
c#除了使用xml的evaluate之外,还有其它几种方式实现,比如1,字串分解成公式.2反射,3调用js引擎等等.
叶子 2008-04-01
  • 打赏
  • 举报
回复
今天刚刚加的分,求简单方案,谢谢大家!
叶子 2008-04-01
  • 打赏
  • 举报
回复
感谢
fcuandy
人, 无完人;学, 无止境
等级:

希望有点简单点的方法
谢谢
叶子 2008-04-01
  • 打赏
  • 举报
回复
还是不给你分了,免得你多个三角,就不好看了!呵呵
cson_cson 2008-04-01
  • 打赏
  • 举报
回复
呵呵!!!
--在函数最开始增加一行:
set @bds = replace(@bds,' ','')--去空格,免得麻烦。
--然后修改下面:
if charindex(@c2,'.0123456789') > 0 or (@c2 = '-' and charindex(@c1,'.0123456789')=0)
--==》》
if charindex(@c2,'.0123456789') > 0 or (@c2 = '-' and @c1 in('','*','-','+','/','('))
叶子 2008-04-01
  • 打赏
  • 举报
回复
To cson_cson
csdn
等级:
----------
只是你的马甲?
呵呵
加载更多回复(46)

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧