@FunctionStr=cast(@var1 as char(5)+'*('+ cast(@var1 as char(5) +'+'+cast(@var1 as char(5) +')'

解决方案 »

  1.   

    具体案例:
    数据库结构:
    id int,长 int,宽 int,厚 int, 计算公式 varchar(200)要得出报表:
    id, 计算结果
      

  2.   

    1楼没有理解我的意思啊?@FunctionStr 是灵活可变的,是由用户自己定义的公式阿
      

  3.   

    declare @FunctionStr char(200);
    set @FunctionStr='1*(3+5)'exec('select '+@FunctionStr)
      

  4.   

    看一下 sp_executesql的帮忙吧
    应该能实现你的功能
      

  5.   

    函数不行,不能用sp_executesql取得结果,改用存储过程:
    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
      

  6.   

    用存储过程我会做,
    但这样的话,只有增加一个字段,用游标计算后填充,然后才能返回所需结果了有没有可能用一个查询直接得出结果呢?
    主要是function里面好像不支持execute语句?
      

  7.   

    --这样可以执行
    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
    因为函数中只能调用函数和扩展存储过程。
      

  8.   

    具体案例:
    数据库结构:
    id int,长 int,宽 int,厚 int, 计算公式 varchar(200)要得出报表:
    id, 计算结果
      

  9.   

    create function AccFunction (@Var1 int, @Var2 int, @Var3 int, @FunctionStr varchar(200))
    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
      

  10.   

    可以加个计算结果字段,存储过程取出每条记录计算后更新该字段函数是无法实现的,因为其不能使用exec,不能取得运算结果
      

  11.   

    对亚,要得就是孔肾这样的东西,可惜:
    服务器: 消息 557,级别 16,状态 2,过程 AccFunction,行 10
    只有函数和扩展存储过程才能从函数内部执行。没有办法可以解决么?
      

  12.   

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_calc]') and xtype in (N'FN', N'IF', N'TF'))
    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
      

  13.   

    ------改用過程吧
    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
      

  14.   

    create proc AccFunction 
    @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
      

  15.   

    zjcxc(邹建) 老
    大就是老大,歷害!