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
( @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