我的存储过程,在SQL查询分析器中执行很好。但我用PB调用时,有问题!
在用PB调用时,是只执行了最后一个EXEC(@SQL)的效果。
--CREATE PROCEDURE CL_Batchmodify
declare @c_deptid varchar(40),@c_tablename varchar(20),@c_fieldid varchar(20),@c_op char(1),@n_value numeric(9,2)
--as
select @c_deptid='16000000',@c_tablename='cl_salary_base',@c_fieldid='cqjjs',@c_op = '',@n_value =31
declare @sql varchar(200),@ls_where varchar(200)
declare @year int,@month int
select isnull(@c_op,'')
select isnull(@c_deptid,'')
if @c_deptid = ''
begin
select @ls_where = ''
end
else
begin
select @ls_where = ' where cl_ry_base.jgid='+@c_deptid+''
end
--如是工资表和考勤表 只能批量更新当前工作年月的数据
--年度月份
select @year=syear,@month=smonth from cl_workday where flag_current= 1
if @c_tablename = 'cl_salary' or @c_tablename = 'yjtz'
if @ls_where = ''
select @ls_where =' where '+@c_tablename+'.syear='+convert(char(4),@year)+' and '+@c_tablename +'.smonth='+convert(varchar(2),@month)
else
select @ls_where =@ls_where + 'and '+@c_tablename +'.syear='+convert(char(4),@year)+' and '+@c_tablename +'.smonth='+convert(varchar(2),@month)
--END
declare @c_string_ryid varchar(100)
if @c_tablename='yjtz'
select @c_string_ryid=@c_tablename+'.staff_cid'
else
select @c_string_ryid=@c_tablename+'.ryid'
--如是员工基本数据表和考勤表 要先处理更新标志
if @c_tablename = 'cl_salary_base' or @c_tablename = 'yjtz'
begin
set @sql='update '+@c_tablename +' set flag_update=0 '
exec(@sql)--针对所有数据先清0 ***这句没执行
set @sql='update '+@c_tablename +' set flag_update=1 from '+ @c_tablename
+' inner join cl_ry_base on cl_ry_base.ryid = '+@c_string_ryid
+ @ls_where
exec(@sql)--针对所选部门再置位 ***这句也没执行
end
--再处理计算数据
if @c_op = ''
set @sql='update '+@c_tablename +' set '+@c_fieldid+'='+convert(varchar(15),@n_value)
+ ' from '+ @c_tablename +' inner join cl_ry_base on cl_ry_base.ryid = '+@c_string_ryid
+ @ls_where
else if @c_op = '+'
set @sql='update '+@c_tablename +' set '+@c_fieldid+'='+@c_fieldid +'+'+convert(varchar(15),@n_value)
+ ' from '+ @c_tablename +' inner join cl_ry_base on cl_ry_base.ryid = '+@c_string_ryid
+ @ls_where
else if @c_op = '-'
set @sql='update '+@c_tablename +' set '+@c_fieldid+'='+@c_fieldid +'-'+convert(varchar(15),@n_value)
+ ' from '+ @c_tablename +' inner join cl_ry_base on cl_ry_base.ryid = '+@c_string_ryid
+ @ls_where
exec(@sql***只执行了这个!
)
GO