SQL Server 存储过程事务+异常捕获+while循环+游标写法

整理一下,SQL Server常用的 存储过程事务+异常捕获+while循环+游标写法,用到哪个就单独抽出来用,以后方便查找。

下面一个存储过程:


SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

create procedure [dbo].[循坏游标带事务的存储过程](
@参数  varchar(4000)--用就有,不用就不需要
)
as
begin

DECLARE @error int,@errorMsg varchar(500)

set @errorMsg=''

BEGIN TRAN --申明 开始事务

 BEGIN TRY ---开始捕捉异常

 --可以循环表,表数据过大可以用临时表,临时表可以建主键索引,循环一条删除一条
 --IF OBJECT_ID('tempdb..#临时表') IS NOT NULL
 --   BEGIN
 --       DROP TABLE #临时表
 --   END

  while 1=1 --循环条件
  begin--循环

  --游标 
  declare @EmpID int  --临时变量,用来保存游标值
  declare y_curr cursor for    --申明游标 为orderNum,userName
  select 列名 from  表名  --游标内容
  open y_curr --打开游标
  fetch next from y_curr into @列名 --将游标中的数据导入临时变量中,多个变量以逗号隔开
  WHILE @@fetch_status = 0 --游标循环
  BEGIN
  --游标循环内容

  ---------------------------------------------------------------------------------
  fetch next from y_curr into @EmpID  --转向下一条数据
END --游标循环结束

  close y_curr --关闭游标
  deallocate y_curr  --释放删除游标引用

end --循环结束
END TRY 
BEGIN Catch
   IF (select count(1) from MASTER.dbo.syscursors where cursor_name='y_curr')>0
   BEGIN 
    close y_curr --关闭游标
    deallocate y_curr  --释放删除游标引用
   END
  select ERROR_LINE() as 错误代码行号,  
  ERROR_MESSAGE() as 错误消息,  
  ERROR_NUMBER() as 错误代码,  
  ERROR_PROCEDURE() as 错误的SP,  
  ERROR_SEVERITY() as 错误严重度,  
  ERROR_STATE() as 错误状态
  set @error=@error+@@error  --记录每次运行sql后 是否正确 0正确
  IF @@TRANCOUNT>0
      ROLLBACK TRAN   ---执行失败,回滚事务

END Catch
 IF @error=0 and @@TRANCOUNT>0
      commit tran   ---执行成功,提交事务

  select @error
end
GO
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server中,存储过程可以使用游标来处理数据。游标是一种用于遍历和操作结果集的数据库对象。SQL Server支持三种游标实现方式:基于DECLARE CURSOR语法、基于OLE DB和ODBC中的API游标函数以及基于API服务器游标。\[2\] 使用游标可以在存储过程中逐行处理结果集,对每一行进行特定的操作。例如,可以使用游标在结果集中循环遍历每一行,并根据特定条件进行数据操作。游标可以在存储过程中声明和使用,通过FETCH语句可以获取结果集中的每一行数据。 以下是一个使用游标的示例代码: ``` CREATE PROCEDURE ProcessData AS BEGIN DECLARE @Name VARCHAR(50) DECLARE @Age INT -- 声明游标 DECLARE CursorName CURSOR FOR SELECT Name, Age FROM YourTable -- 打开游标 OPEN CursorName -- 获取第一行数据 FETCH NEXT FROM CursorName INTO @Name, @Age -- 循环处理结果集 WHILE @@FETCH_STATUS = 0 BEGIN -- 在这里可以对每一行数据进行操作 -- 例如,可以根据条件更新数据或者进行其他逻辑处理 -- 获取下一行数据 FETCH NEXT FROM CursorName INTO @Name, @Age END -- 关闭游标 CLOSE CursorName DEALLOCATE CursorName END ``` 在上述示例中,我们声明了一个名为CursorName的游标,并使用FETCH语句获取每一行数据。然后,我们可以在循环中对每一行数据进行操作。最后,我们关闭并释放游标。请注意,在实际使用中,应根据具体需求进行适当的修改和优化。\[1\] #### 引用[.reference_title] - *1* *2* *3* [Sql Server 存储过程游标](https://blog.csdn.net/qq_29342297/article/details/109181443)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值