p_GetInsVarValue

CREATE PROCEDURE p_GetInsVarValue
( @Formula varchar(2000),                --函数表达式
  @FResult float output,             --返回值
  @ErrorStr varchar(2000) output         --返回错误
) WITH ENCRYPTION 
as
declare @i Int
declare @j Int
declare @SQLText char(2000)
declare @FuncEName char(2000)
declare @FuncFormula char(2000)
declare @FormulaStr char(2000)        --检查前的函数表达式
declare @ParamName char(100)
declare @ParamValue char(100)
declare @NewExpree char(2000)         --检查后形成的表达式
declare @Str char(50)
declare @ReturnResult decimal(18,4)  --计算返回值
declare @FuncStr char(50)            --函数名
declare @isSYS bit                   --是否是系统函数
declare @SQLStr char(2000)            --SQL 语名串
declare @Function varchar(2000)       --sun:保存函数的格式
declare @GetChar char(1)
declare @p1 int, @p2 int, @p int, @FuncP1 int, @FuncP2 int, @StrLenght int, @FunctionID int
declare @flg bit
declare @IfZero int                  --sun:除零标志
declare @CheckFlag int               --sun : 纯粹的公式检查标志
  --get...(...,...,...) 函数形式
  Select @i = patindex('%(%',@Formula);
  Select @FuncEName = substring(@Formula,1,@i-1);
  Select @SQLText =  SQLText From Sys_Function Where FuncEName = @FuncEName
  if @SQLText is null
  begin
    Select @FResult = '无系统函数' 
    Return
  end
  Select @FuncFormula = FuncFormula From Sys_Function Where FuncEName = @FuncEName
  Select @ParamName = ''
  Select @ParamValue = ''
  while @FuncFormula <> ''
  begin
    --获取参数
    Select @i = patindex('%::%',@FuncFormula)
    Select @FuncFormula = substring(@FuncFormula,@i,Len(@FuncFormula)-@i+1)
    Select @j = patindex('%,%',@FuncFormula)
    if @j = 0
      Select @j = patindex('%)%',@FuncFormula)
    Select @ParamName = substring(@FuncFormula,1,@j-1)     
    Select @FuncFormula = substring(@FuncFormula,@j+1,Len(@FuncFormula)-@j)
    --获取传入的参数值
    while @Formula <> ''
    begin
      Select @i = patindex('%::%',@Formula)
      Select @Formula = substring(@Formula,@i,Len(@Formula)-@i+1)
      Select @j = patindex('%,%',@Formula)
      if @j = 0
        Select @j = patindex('%)%',@Formula)
      Select @ParamName = substring(@Formula,1,@j-1)     
    end
    if (@ParamName = '') or (@ParamValue = '')
    begin
      Select @FResult = '参数个数与参数值个数不对应' 
      Return
    end
    Select Replace(@SQLText,@ParamName,@ParamValue)
  end
  Create table #temp (field Char(1000))
  Exec ('insert #temp (field) values('+ @FormulaStr+')')   
  Select @FResult = field from #temp

posted on 2005-10-22 11:56  Sanle  阅读(169)  评论(0编辑  收藏  举报

导航