一个字符串的问题,求教

叶子 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

--拼串执行可以,直接执行就不行
--寻找个解决方案,谢谢大家
--注:我要把它放到函数里,函数里有很多东西不能用。
...全文
682 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)
【更新至2025年】2001-2025年上市公司数字化转型年报词频统计(吴非、赵宸宇、甄红线)(300+年报词频统计) 1、时间:2001-2025年 2、来源:上市公司年报 3、参考文献:企业数字化转型与资本市场表现——来自股票流动性的经验证据(吴非) 数字化转型如何影响企业全要素生产率(赵宸宇) 知识产权行政保护与企业数字化转型(甄红线) 4、方法说明:(1)参考吴非老师的做法,对人工智能技术、大数据技术、云计算技术、区块链技术、数字技术运用五个维度76个数字化相关词频进行统计 (2)参考赵宸宇老师的做法,对数字技术应用、互联网商业模式、智能制造、现代信息系统四个维度99个数字化相关词频进行统计 (3)参考甄红线老师的做法,对技术分类、组织赋能、数字化应用等类别下139个数字化相关词频进行统计 5、指标:年份、股票代码、公司简称、行业名称、行业代码、全文-文本总长度、仅中英文-文本总长度、人工智能技术-吴、大数据技术-吴、云计算技术-吴、区块链技术-吴、数字技术运用-吴、数字技术应用-赵、互联网商业模式-赵、智能制造-赵、现代信息系统-赵、技术分类-人工智能技术-甄、技术分类-区块链技术-甄、技术分类-云计算技术-甄、技术分类-大数据技术-甄、组织赋能-人工智能技术-甄、组织赋能-云计算技术-甄、组织赋能-大数据技术-甄、组织赋能-广义数字技术-甄、数字化应用-技术创新-甄、数字化应用-流程创新-甄、数字化应用-业务创新-甄、人工智能、商业智能、图像理解、投资决策辅助系统、智能数据分析、智能机器人、机器学习、深度学习、语义搜索、生物识别技术、人脸识别、语音识别、身份验证、自动驾驶、自然语言处理、大数据、数据挖掘、文本挖掘、数据可视化、异构数据、征信、增强现实、混合现实、虚拟现实、云计算、流计算、图计算、内存计算、多方安全计算、类脑计算、绿色计算、认知计算等300+词频

34,876

社区成员

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

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