天天看點

SQL Server 遊标curso

1.遊标是什麼

  遊标是SQL Server的一種資料通路機制,它允許使用者通路單獨的資料行。使用者可以對每一行進行單獨的處理,進而降低系統開銷和潛在的阻隔情況,使用者也可以使用這些資料生成的SQL代碼并立即執行或輸出。

2.遊标的優點

  SELECT 語句傳回的是一個結果集,但有時候應用程式并不總是能對整個結果集進行有效地處理,遊标便提供了這樣一種機制,它能從包括多條記錄的結果集中每次提取一條記錄,遊标總是與一跳SQL選擇語句相關聯,由結果集和指向特定記錄的遊标位置組成。使用遊标具有一下優點:

(1).允許程式對由SELECT查詢語句傳回的行集中的每一次執行相同或不同的操作,而不是對整個集合執行同一個操作。

(2).提供對基于遊标位置中的行進行删除和更新的能力。

(3).遊标作為資料庫管理系統和應用程式設計之間的橋梁,将兩種處理方式連接配接起來。

3.遊标的使用

3.1聲明遊标

DECLARE 遊标名 CURSOR
           

3.2打開遊标

open 遊标名
           

3.3擷取遊标資料,當遊标被打開時,行指針将指向該遊标集第1行之前,如果要讀取遊标集中的第1行資料,必須移動行指針使其指向第1行

FETCH NEXT FROM 遊标名
           

3.4關閉遊标/删除遊标

CLOSE 遊标名       --關閉遊标
DEALLOCATE 遊标名    --删除遊标
           

3.5操作遊标

DECLARE E1cursor cursor      --聲明遊标,預設為FORWARD_ONLY遊标
FOR SELECT * FROM c_example 
OPEN E1cursor                --打開遊标 
FETCH NEXT from E1cursor     --讀取第1行資料
WHILE @@FETCH_STATUS = 0     --用WHILE循環控制遊标活動
    BEGIN 
    FETCH NEXT from E1cursor    --在循環體内将讀取其餘行資料
    END 
CLOSE E1cursor               --關閉遊标 
DEALLOCATE E1cursor          --删除遊标
           

4.執行個體一

DECLARE cur_temp_objectid CURSOR FOR
	SELECT	
		ObjectId,
		TxCode,
		LOP,
		CmpTime
	FROM #temp_objectid
	 
	OPEN cur_temp_objectid
	FETCH NEXT FROM cur_temp_objectid INTO	
		@temp_objectid,
		@temp_txcode,
		@temp_lop,
		@temp_cmptime

	WHILE (@@FETCH_STATUS <> -1)
		BEGIN
			DELETE FROM #temp_wimovements
			INSERT INTO #temp_wimovements
				SELECT 
					Object_ID,
					......
					JobStatus
				FROM RPT_WITAT_WIMOVEMENTS (NOLOCK)
				WHERE InsTimeStamp <= @temp_cmptime
					AND Object_ID = @temp_objectid
		END 

	CLOSE @return_cursor        --關閉遊标
	DEALLOCATE @return_cursor    --釋放遊标
           

執行個體二

DECLARE @return_cursor    CURSOR     --聲明遊标@return_cursor
	 DECLARE @temp_error_objectid  char(15) 
	
     EXEC SP_DEL_ERROR_OBJID                
		@StartDate,
		@EndDate,
		@return_cursor	OUTPUT    --執行其他SP,傳回@return_cursor

	FETCH NEXT FROM @return_cursor INTO    --從@return_cursor獲得一個值賦給@temp_error_objectid
		@temp_error_objectid

	WHILE (@@FETCH_STATUS <> -1)    --循環
		BEGIN
		-- delete error objectId
		delete from #temp_objectid where ObjectID = @temp_error_objectid    --執行sql

		FETCH NEXT FROM @return_cursor INTO    --再從@return_cursor擷取下一個值重新賦給@temp_error_objectid 
		@temp_error_objectid 
		END -- WHILE (@@FETCH_STATUS <> -1)

	CLOSE @return_cursor        --關閉遊标
	DEALLOCATE @return_cursor    --釋放遊标
           

5.參考連結:

SQL Server基礎之遊标---阿赫瓦裡

SQLServer遊标(Cursor)簡介和使用說明 及全局變量說明和功能---zzy7075

繼續閱讀