天天看点

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

继续阅读