存储过程游标,事务的应用

ALTER PROCEDURE [dbo].[userinfor2]
@id int,
@UserID int output
AS
BEGIN
SET NOCOUNT ON;
declare @name varchar(500)
begin try
BEGIN TRAN
declare youbiao cursor for select id from UserInfor where id=@id
declare @getid varchar(400)
open youbiao
begin
fetch next from youbiao into @getid
update UserInfor set name=@getid+'111' where id=@getid
end
close youbiao
deallocate youbiao
COMMIT
end try
BEGIN CATCH
RETURN 222
END CATCH
begin
set @name='dddddd'

end
select @name as name2
return @UserID
END

===============================

官网一个小例子

@@FETCH_STATUS

返回类型

整数

回报值

返回值描述
0 FETCH语句成功。
-1 FETCH语句失败或行超出结果集。
-2 提取的行丢失。
-9 光标未执行撷取操作。

备注

因为@@ FETCH_STATUS对连接上的所有游标是全局的,请仔细使用@@ FETCH_STATUS。执行FETCH语句后,@@ FETCH_STATUS的测试必须在对另一个游标执行任何其他FETCH语句之前进行。在连接发生任何提取之前,@@ FETCH_STATUS的值未定义。

例如,用户从一个游标执行FETCH语句,然后调用存储过程,该过程打开并处理另一个游标的结果。当从调用存储过程返回控制时,@@ FETCH_STATUS反映在存储过程中执行的最后一个FETCH,而不是调用存储过程之前执行的FETCH语句。

要检索特定游标的上次获取状态,请查询sys.dm_exec_cursors动态管理功能的fetch_status列。

例子

以下示例用于@@FETCH_STATUS控制WHILE循环中的游标活动

DECLARE Employee_Cursor CURSOR FOR SELECT BusinessEntityID, JobTitle FROM AdventureWorks2012.HumanResources.Employee;

OPEN Employee_Cursor;

FETCH NEXT FROM Employee_Cursor;

WHILE @@FETCH_STATUS = 0

BEGIN

FETCH NEXT FROM Employee_Cursor;

END;

CLOSE Employee_Cursor;

DEALLOCATE Employee_Cursor;

GO

     游标一般格式:
DECLARE 游标名称 CURSOR FOR SELECT 字段1,字段2,字段3,... FROM 表名 WHERE ...
OPEN 游标名称
FETCH NEXT FROM 游标名称 INTO 变量名1,变量名2,变量名3,...
WHILE @@FETCH_STATUS=0
        BEGIN
                  SQL语句执行过程... ...
                  FETCH NEXT FROM 游标名称 INTO 变量名1,变量名2,变量名3,...
        END
CLOSE 游标名称
DEALLOCATE 游标名称 (删除游标)

原文地址:https://www.cnblogs.com/suppler/p/6994243.html