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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章