整理一下,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