下面是一个游标的实例,方便初学者学习,也可以防止自己忘记 。
DECLARE H_SETTLE CURSOR SCROLL FOR SELECT * FROM TABELNAME --声明一个可循环操作的游标
OPEN H_SETTLE --打开游标
FETCH FIRST FROM H_SETTLE INTO @VARIABLE_NAME=FIELD_NAME,@VARIABLE_NAME=FIELD_NAME --游标移到第一个记录
WHILE (@@FETCH_STATUS=0) --检查游标是不是最后一个,如果不是则进行中间的程序
BEGIN
…… --一段处理程序段
FETCH NEXT FROM H_SETTLE INTO @VARIABLE_NAME=FIELD_NAME,@VARIABLE_NAME=FIELD_NAME --游标移到下一个记录
END
CLOSE H_SETTLE --关闭游标
DEALLOCATE H_SETTLE --释放游标
------------------------------------以上是SQL2005下的例子------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------以下是SQL2008下的例子------------------------------------
--声明变量DECLARE @Pat_IN_HOS_ID DECIMAL(18,0)
DECLARE @IN_BILL_ID DECIMAL(18,0) --需要插入的IN_BILL_ID
DECLARE @PAT_IN_CHARGE_DOC_ID VARCHAR(35) --上一行记录的值
DECLARE @IN_HOS_DOC_ID VARCHAR(35) --上一行记录的值
DECLARE @CHIEF_DOC_ID VARCHAR(35) --上一行记录的值
DECLARE @MANAGE_BED_NURSE_ID VARCHAR(35) --上一行记录的值
--判断临时表是否存在,不存在在建立临时表,用于保存修改记录
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[DBO].[IN_BILL_RECORD_LSG]') AND type in (N'U'))
BEGIN
--如果不存在建立一个表,用于备份要修改的数据
END
--把需要修改的记录插入到临时表
INSERT INTO [DBO].IN_BILL_RECORD_LSG **************************************
--定义游标,用于循环处理需要处理的记录
DECLARE CUR_INBILL CURSOR SCROLL FOR SELECT b.IN_BILL_ID,b.PAT_IN_HOS_ID FROM [DBO].IN_BILL_RECORD_EXTEND a
RIGHT JOIN [DBO].IN_BILL_RECORD b ON a.IN_BILL_ID = b.IN_BILL_ID WHERE PAT_IN_CHARGE_DOC_ID IS NULL
AND CREATE_TIME>='2014-09-09 00:00:00.000' ORDER BY b.IN_BILL_ID ASC
--打开游标
OPEN CUR_INBILL
FETCH FIRST FROM CUR_INBILL INTO @IN_BILL_ID,@Pat_IN_HOS_ID
WHILE (@@FETCH_STATUS=0)
BEGIN
--处理过程
--循环下一个游标
FETCH NEXT FROM CUR_INBILL INTO @IN_BILL_ID,@Pat_IN_HOS_ID
END
--关闭游标并释放变量
CLOSE CUR_INBILL
DEALLOCATE CUR_INBILL