跳到主要內容

Sql Server Stored Procedure Cursor

CREATE PROCEDURE GENMATCH(@STARTTIME datetime output, @ENDTIME datetime output,@PTYPE int output)
AS
DECLARE   @JN_MCM_ID    INT   --宣告變數
DECLARE   @JN_NAME     VARCHAR(30)
DECLARE   @JN_VALUE    VARCHAR(30)
select @STARTTIME = getdate()   --給定回傳變數的值
delete from JobNeededTemp    --先刪除資料表中的資料
delete from MatchLogForDailyPaper
DECLARE  JOBNEEDEDTEMP_CURSOR_1  CURSOR FOR      --宣告CURSOR  將值賦予CURSOR
SELECT   JN_MCM_ID , JN_NAME , JN_VALUE  FROM    JOBNEEDEDTEMP  WHERE  ( JN_NAME='JN_AC_ZIPCODE'  OR   JN_NAME='JN_NAMENO_1'  )
OPEN  JOBNEEDEDTEMP_CURSOR_1    --開啟CURSOR
FETCH NEXT FROM JOBNEEDEDTEMP_CURSOR_1  INTO  @JN_MCM_ID , @JN_NAME , @JN_VALUE  --將CURSOR中的第一列資料 傳給宣告的變數
WHILE @@FETCH_STATUS = 0   --0 陳述式順利執行。-1 陳述式失敗,或資料列超出結果集。-2 擷取的資料列已遺漏。
BEGIN
    UPDATE   ComJobStatistic   SET   S_OPEN_JOBTYPE_NUMBER  = @JN_MCM_ID   WHERE  DATEDIFF(D,S_DATE,GETDATE()) = 0
        if @@ERROR >0  --若有錯誤產生
        BEGIN
          PRINT  @JN_MCM_ID
        END
        FETCH NEXT FROM JOBNEEDEDTEMP_CURSOR_1  INTO  @JN_MCM_ID , @JN_NAME , @JN_VALUE    --將CURSOR中的下一筆資料 傳給宣告的變數
END
CLOSE   JOBNEEDEDTEMP_CURSOR_1   --關閉CURSOR
DEALLOCATE  JOBNEEDEDTEMP_CURSOR_1    --刪除CURSOR

select @ENDTIME = getdate()   --給定回傳變數的值
select @PTYPE = 1     --給定回傳變數的值
GO

===========================================================================================
執行測試
DECLARE  @R_STARTTIME    DATETIME
DECLARE  @R_ENDTIME    DATETIME
DECLARE  @R_PTYPE   INT
EXEC GENMATCH   @R_STARTTIME  OUTPUT ,  @R_ENDTIME  OUTPUT  ,   @R_PTYPE  OUTPUT
===========================================================================================
查看執行後的結果
SELECT  @R_STARTTIME
SELECT  @R_ENDTIME
SELECT   @R_PTYPE


---------------------------------------------------------------------------------------
ALTER PROCEDURE [dbo].[InsertData](@Input_ID int , @result bit output)  --注意欄位型態..
AS
DECLARE   @C1    int   --宣告變數
DECLARE   @C2     VARCHAR(50)
DECLARE   @C3    VARCHAR(50)
SELECT @result = 1
DECLARE  CURSOR1  CURSOR FOR      --宣告CURSOR  將值賦予CURSOR
SELECT   ID,FileID,Photographer FROM Picture  WHERE  ID < @Input_ID  --注意欄位型態..
OPEN  CURSOR1    --開啟CURSOR
FETCH NEXT FROM CURSOR1 INTO @C1 , @C2 , @C3  --將CURSOR中的第一列資料 傳給宣告的變數
WHILE @@FETCH_STATUS = 0   --0 陳述式順利執行。-1 陳述式失敗,或資料列超出結果集。-2 擷取的資料列已遺漏。
BEGIN
        INSERT INTO Table1(C1,C2,C3) VALUES(@C1,@C2,@C3)
        INSERT INTO Table2(C1,C2,C3) VALUES(@C1,@C2,@C3)
        if @@ERROR >0  --若有錯誤產生
        BEGIN
          SELECT @result = 0        
        END
        FETCH NEXT FROM CURSOR1  INTO  @C1 , @C2 , @C3   --將CURSOR中的下一筆資料 傳給宣告的變數
END
CLOSE   CURSOR1   --關閉CURSOR
DEALLOCATE  CURSOR1    --刪除CURSOR
===========================================================================================
執行測試
DECLARE  @result bit
EXEC dbo.InsertData 4 , @result OUTPUT
SELECT  @result