--测试数据
create table 公式表(工资项目 sysname,项目代码 sysname,是否打印 bit,计算公式 varchar(1000))
insert into 公式表
select '基本工资','gz1',1,null
union all select '考勤','gz2',1,null
union all select '工龄','gz3',1,null
union all select '奖金','gz4',1,null
union all select '应发工资','gz5',1,'gz1+gz2+gz3+gz4'
union all select '养老保险','gz6',0,null
union all select '应纳税收入','gz7',1,'case when gz5-gz6>0 then gz5-gz6 else 0 end'
union all select '个人所得税','gz8',1,'case when gz7<500 then gz7*.05 else case when gz7>=500 and gz7<2000 then gz7*.1-25 else gz7*.15-125 end end'
union all select '实发工资','gz9',1,'gz5-gz6-gz8'
create table 工资表(职员 varchar(10),gz1 int,gz2 int,gz3 int,gz4 int
,gz5 int,gz6 int,gz7 int,gz8 int,gz9 int)
insert into 工资表(职员,gz1,gz2,gz3,gz4,gz6)
select '张三',1000,1,1,100,100
union all select '李四',1200,1,2,150,150
go
--工资计算的存储过程
create proc p_calc
as
declare @s1 varchar(8000),@s2 varchar(8000),@s3 varchar(8000) ,@i1 int,@i2 varchar(20)
select @s1=''
select @s2=''
select @s3=''
Select @i1=0
select @i1=@i1+1,@i2='@'+cast(@i1 as varchar)
,@s1=@s1+','+@i2+' varchar(8000)'
,@s2=@s2+','+@i2+'=''update 工资表 set ['+项目代码+']=('+计算公式+')''' --這裡放到一行
,@s3=@s3+'
exec('+@i2+')'
from 公式表 where 计算公式 is not null
select @s1=substring(@s1,2,8000),@s2=substring(@s2,2,8000) --4改為2
exec('declare '+@s1+'
select '+@s2+'
'+@s3)
print 'declare '+@s1+' select '+@s2+' '+@s3
go
--调用存储过程,实现工资计算
exec p_calc
go
--显示计算结果
select * from 工资表
go
--删除测试环境
drop table 公式表,工资表
drop proc p_calc
具体见此贴:http://community.csdn.net/Expert/topic/4797/4797593.xml?temp=.2456629