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

发布了28 篇原创文章 · 获赞 0 · 访问量 9万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章