实现工资自定义公式的计算方法示例

--测试数据  
  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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值