@FunctionStr=cast(@var1 as char(5)+'*('+ cast(@var1 as char(5) +'+'+cast(@var1 as char(5) +')'
解决方案 »
- 如何判断一个字段只包含12个数字,挑出来不是这样的字段。在线等,急
- 关于导出CSV的问题
- 如何去掉左表中重复的行?
- SQL 中如何这样保留小数(急!)
- 从数据库中只取出2007年1月的数据,用什么方法啊
- ~~~~~~~~~~交叉表的问题,请指点
- 你能用算术运算符+、-、*、/ 及左右括号使3、4、5、6的结果等于28吗?每个数字只能用一次,每个算术运算符和括号也只能用一次
- 關於效率的問題
- 数据查询显示问题
- 历史性奇怪问题:对一个表可以进行增添操作,但是不能进行修改、删除操作(一定给分)
- 这样一个SQL语句的索引应该怎么建
- 初学者 power designer . 请问是不是可以在 里面设计一个表(使数据库增加一个表)?这不是相当于power designer 直接操作数据库吗?
数据库结构:
id int,长 int,宽 int,厚 int, 计算公式 varchar(200)要得出报表:
id, 计算结果
set @FunctionStr='1*(3+5)'exec('select '+@FunctionStr)
应该能实现你的功能
create procedure sp_1 @Var1 int,@Var2 int,@Var3 int,@FunctionStr varchar(200),@result int output
as
declare @sql nvarchar(4000)
set @FunctionStr=replace(replace(replace(@FunctionStr,'@Var1',cast(@Var1 as varchar)),'@Var2',cast(@Var2 as varchar)),'@Var3',cast(@Var3 as varchar))
set @sql='select @result='+@FunctionStr
exec sp_executesql @sql,N'@result int output',@result output
go
--调用
declare @result int
exec sp_1 1,3,5,'@var1 * (@var2 + @var3)',@result output
print @result
--结果:8
但这样的话,只有增加一个字段,用游标计算后填充,然后才能返回所需结果了有没有可能用一个查询直接得出结果呢?
主要是function里面好像不支持execute语句?
declare @Var1 int
declare @Var2 int
declare @Var3 int
declare @FunctionStr nvarchar(200)
declare @r int
declare @s nvarchar(8000)
@FunctionStr='@var1 * (@var2 + @var3)'
@var1=1
@var1=3
@var1=5
select @FunctionStr = replace(@FunctionStr,'@Var1',rtrim(@Var1))
select @FunctionStr = replace(@FunctionStr,'@Var2',rtrim(@Var2))
select @FunctionStr = replace(@FunctionStr,'@Var3',rtrim(@Var3))
set @s = N'select @r = '+@FunctionStr
exec sp_executesql @s,'@r int out',@r out
select @r--但是这样不行
create function AccFunction (
@Var1 int,
@Var2 int,
@Var3 int,
@FunctionStr nvarchar(200))
returns int
AS
begin
declare @r int
declare @s nvarchar(8000)
select @FunctionStr = replace(@FunctionStr,'@Var1',rtrim(@Var1))
select @FunctionStr = replace(@FunctionStr,'@Var2',rtrim(@Var2))
select @FunctionStr = replace(@FunctionStr,'@Var3',rtrim(@Var3))
set @s = N'select @r = '+@FunctionStr
exec sp_executesql @s,'@r int out',@r out
return @r
end
因为函数中只能调用函数和扩展存储过程。
数据库结构:
id int,长 int,宽 int,厚 int, 计算公式 varchar(200)要得出报表:
id, 计算结果
returns int
as
begin
declare @i int,@s varchar(1000)
set @FunctionStr=replace( @FunctionStr,'@Var1',@Var1)
set @FunctionStr=replace( @FunctionStr,'@Var2',@Var2)
set @FunctionStr=replace( @FunctionStr,'@Var3',@Var3)
set @s=' select @i='+@FunctionStr
exec sp_executesql @s,'@i int out',@i out
return(@i)
end
服务器: 消息 557,级别 16,状态 2,过程 AccFunction,行 10
只有函数和扩展存储过程才能从函数内部执行。没有办法可以解决么?
drop function [dbo].[f_calc]
GO/*--计算表达式的函数 计算给定算术表达式的值 此方法由VB版 hhjjhjhj(大头)
提供的VB处理程序程序上改造而来--邹建 2004.07(引用请注明此信息)--*//*--调用示例 select dbo.f_calc(''@var1 * (@var2 + @var3)',1,3,5)
--*/
create function f_calc(
@FunctionStr Nvarchar(1000), --要计算的表达式
@var1 int,
@var2 int,
@var3 int
)returns sql_variant
as
begin
declare @re sql_variant,@str nvarchar(1000)
select @str=replace(replace(replace(@FunctionStr
,N'@var1',@var1)
,N'@var2',@var2)
,N'@var3',@var3)
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--调用
select dbo.f_calc('@var1 * (@var2 + @var3)',1,3,5)--结果: 8
Create Proc AccFunction
@Var1 int,
@Var2 int,
@Var3 int,
@FunctionStr varchar(200)
as
declare @i int,@s varchar(1000)
set @FunctionStr=replace( @FunctionStr,'@Var1',@Var1)
set @FunctionStr=replace( @FunctionStr,'@Var2',@Var2)
set @FunctionStr=replace( @FunctionStr,'@Var3',@Var3)
set @s=' select @i='+@FunctionStr
exec sp_executesql @s,'@i int out',@i out
select @i
-----------------------------
declare @i int
create table #b(c int)
insert into #b exec accfunction 3,4,5,'@var1 * (@var2 + @var3)'
select @i=c from #b
drop table #b
select @i
@var1 int,
@var2 int,
@var3 int,
@functionstr nvarchar(200),
@s int output
asdeclare @result int
set @functionstr='@var1 * (@var2 + @var3)'
set @var1=1
set @var2=3
set @var3=5
select @FunctionStr = replace(@FunctionStr,'@var1',convert(nvarchar,@var1))
select @FunctionStr = replace(@FunctionStr,'@var2',convert(nvarchar,@var2))
select @FunctionStr = replace(@FunctionStr,'@var3',convert(nvarchar,@var3))
select @FunctionStr=N'select @result='+@FunctionStr
exec sp_executesql @FunctionStr,N'@result int out',@result out
select @s=@result------------------------------declare @s int
execute AccFunction
1,
3,
5,
N'@var1 * (@var2 + @var3)',
@s output
select @s
大就是老大,歷害!