表1 view_jsgs_value(实际是DATA表与公式表的JOIN视图)
sjsj qybm value1 value2 value3 .. jsgs
1999 XXXX 111 222 3333 value1 + value2
...
表2 jsgsb
f_name jsgs
xxxx value1 + value2 + yyyy
fdfd xxxx + value2
yyyy value1 - xxxx --这里其实就是死循环了,XXXX的公式中包括YYYY
...
CREATE PROCEDURE p_calc
@sjsj nvarchar(7),
@qybm nvarchar(9),
@jsgs nvarchar(2000),
@re decimal(20,2) out
AS
declare @s nvarchar(4000)
select @s = ' select @re=' + @jsgs + ' from (select * from view_jsgs_value where sjsj = '+ '''' + @sjsj +
''''+ ' and qybm = ' + '''' + @qybm + '''' + ') as a'
exec sp_executesql @s , N'@re decimal(20,2) out ' , @re out
if @@error <> 0 set @re = -10000
GO
上述存储过程中@jsgs是一个自定义公式,通过EXEC来计算执行结果,当JSGS错误时,会发生列名不存在的错误信息,虽然对最终结果无影响,但想捕捉该错误并屏蔽掉查询分析器的出错信息.
(因为数据已经存在,所以这里不考虑在创建前检测公式合法性的处理方法,只考虑补救方法)
另外,用什么方法把所有错误的公式查找出来(可能还设计到公式死循环的问题)
sjsj qybm value1 value2 value3 .. jsgs
1999 XXXX 111 222 3333 value1 + value2
...
表2 jsgsb
f_name jsgs
xxxx value1 + value2 + yyyy
fdfd xxxx + value2
yyyy value1 - xxxx --这里其实就是死循环了,XXXX的公式中包括YYYY
...
CREATE PROCEDURE p_calc
@sjsj nvarchar(7),
@qybm nvarchar(9),
@jsgs nvarchar(2000),
@re decimal(20,2) out
AS
declare @s nvarchar(4000)
select @s = ' select @re=' + @jsgs + ' from (select * from view_jsgs_value where sjsj = '+ '''' + @sjsj +
''''+ ' and qybm = ' + '''' + @qybm + '''' + ') as a'
exec sp_executesql @s , N'@re decimal(20,2) out ' , @re out
if @@error <> 0 set @re = -10000
GO
上述存储过程中@jsgs是一个自定义公式,通过EXEC来计算执行结果,当JSGS错误时,会发生列名不存在的错误信息,虽然对最终结果无影响,但想捕捉该错误并屏蔽掉查询分析器的出错信息.
(因为数据已经存在,所以这里不考虑在创建前检测公式合法性的处理方法,只考虑补救方法)
另外,用什么方法把所有错误的公式查找出来(可能还设计到公式死循环的问题)
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货