SQL存储过程

在这里做个备份

/*AutoInitProc
*
* Create for autoInit
* by vigor 2005.2.14
*
*/
USE chargeDB

/********创建视图******************************************************************/
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'StudentView_clas' AND type = 'V')
   DROP VIEW StudentView_clas
GO
CREATE  VIEW StudentView_clas
AS
  SELECT stud_id,stud_class,stud_clasflag FROM studentInfo
/**************************************************************************************/
GO

/********创建过程******************************************************************/
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'AutoInitProc' AND type = 'P')
   DROP PROCEDURE AutoInitProc
GO
CREATE PROCEDURE AutoInitProc
  @operatorId char(3),  --传递进来的操作员代号
  @total int OUTPUT,    --传递出去的进度总数(用于进度显示)
  @current int OUTPUT   --传递出去的当前进度(用于进度显示)
AS
BEGIN --过程开始
  DECLARE @tari_id char(20),@tari_feeid char(8),@tari_feename char(20),@tari_payable char(4);
  DECLARE @stud_id char(15),@stud_class char(20),@stud_clsflag char(1);
  DECLARE @STEPCOUNTER int;
  SET NOCOUNT ON
 
  BEGIN TRANSACTION   --开始事务
 
  SELECT COUNT(*)  FROM Tariff1Info GROUP BY Tari_classid 
  SET @total=@@ROWCOUNT        --返回总进度(即Tariff1Info中的班级个数)
  SET @current=0;

  DECLARE Tari_Cur SCROLL CURSOR       --声明外部游标
  FOR
  SELECT tari_classid FROM Tariff1Info ORDER BY tari_classid;

  OPEN Tari_Cur;                       --打开外部游标
  FETCH NEXT FROM Tari_Cur INTO  @tari_id;
  SELECT @STEPCOUNTER=COUNT(Tari_classid) FROM Tariff1Info WHERE
Tari_classid=@tari_id;--统计当前(@tari_id)的数量,减少筛选次数

  WHILE @@FETCH_STATUS=0
  BEGIN
    DECLARE Stud_Cur SCROLL CURSOR    --声明内部游标
    FOR
    SELECT * FROM StudentView_clas WHERE
stud_class=@tari_Id;
   
    OPEN Stud_Cur;                     --打开内部游标
    FETCH NEXT FROM Stud_Cur INTO  @stud_id, @stud_class, @stud_clsflag;
    WHILE @@FETCH_STATUS=0
    BEGIN
      IF @stud_clsflag=1
      BEGIN
        DECLARE Temp_Cur SCROLL CURSOR  --声明零时游标
        FOR
        SELECT * FROM Tariff1Info WHERE
tari_classid=@tari_Id;
       
        OPEN Temp_Cur;                  --打开零时游标
        FETCH NEXT FROM Temp_Cur INTO @tari_id,@tari_feeid,@tari_feename,@tari_payable;
        WHILE @@FETCH_STATUS=0
        BEGIN
          IF EXISTS(SELECT * FROM TempPayable WHERE
tepa_studid=@stud_id AND tepa_feeid=@tari_feeid)
            PRINT '此项已经初始';
          ELSE
            INSERT TempPayable VALUES(@stud_id,@tari_feeid,@tari_feename,@tari_payable,GetDate(),@operatorId);
          FETCH NEXT FROM Temp_Cur INTO @tari_id,@tari_feeid,@tari_feename,@tari_payable;
        END;
        CLOSE Temp_Cur;                 --关闭零时游标
        DEALLOCATE Temp_Cur;            --释放零时游标
       END
       ELSE
         PRINT '此学生不参加班级自动初始';
      FETCH NEXT FROM Stud_Cur INTO  @stud_id, @stud_class, @stud_clsflag;
    END
    CLOSE Stud_Cur;                   --关闭内部游标
    DEALLOCATE Stud_Cur;              --释放内部游标
    FETCH RELATIVE @STEPCOUNTER FROM Tari_Cur INTO  @tari_id;--向后取@STEPCOUNTER的记录
    SET @current=@current+1;
    SELECT @STEPCOUNTER=COUNT(Tari_classid) FROM Tariff1Info WHERE
Tari_classid=@tari_id;--统计当前(@tari_id)的数量,减少筛选次数
  END;
  CLOSE Tari_Cur;                     --关闭外部游标
  DEALLOCATE Tari_Cur;                --释放外部游标

  COMMIT TRANSACTION;   --提交事务

END;--过程结束

---测试------
GO

DECLARE @TOTAL INT,@CURRENT INT;
EXEC AutoInitProc 028,@TOTAL OUTPUT,@CURRENT OUTPUT
PRINT @TOTAL
PRINT @CURRENT

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值