MSSQL中,一个事务(TRANSACTION)中支持多次执行存储过程(PROCEDURE)
2021/4/25 19:25:20
本文主要是介绍MSSQL中,一个事务(TRANSACTION)中支持多次执行存储过程(PROCEDURE),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
先创建一个测试表:
-- 创建测试表格 CREATE TABLE table_test ( [id] [int] NOT NULL PRIMARY KEY IDENTITY(1, 1), [name] [varchar] (50) NULL, ) GO
创建存储过程:
-- 测试用的存储过程 CREATE PROCEDURE proc_test @name AS VARCHAR(60) AS BEGIN INSERT INTO dbo.table_test(name) VALUES(@name) END GO
测试一个事务中执行多次存储过程:
-- 在一个事务中执行两次存储过程 BEGIN TRANSACTION --执行存储过程 EXECUTE dbo.proc_test @name='张三'; EXECUTE dbo.proc_test @name='李四'; EXECUTE dbo.proc_test @name='王五'; --提交存储过程 COMMIT TRANSACTION GO
执行结果:
关于存储过程中执行出错后,会继续执行后续的脚本。测试:
-- 在一个事务中执行两次存储过程 BEGIN TRANSACTION --执行存储过程 EXECUTE dbo.proc_test @name='张三'; -- 长度超过表格的50,超过存储过程变量的60 EXECUTE dbo.proc_test @name='李四asdfasdfasdfasdfasdfasdfasfasdfasdfasdfasdfasdfasdfasfasdfasdfasdfasdfasdfasdfasf'; EXECUTE dbo.proc_test @name='王五'; --提交存储过程 COMMIT TRANSACTION GO
执行结果:
可以看到参数超过存储过程的变量长度,存储过程就报错了。但后续的脚本继续执行完成了。
我们应该优化语句:
-- 在一个事务中执行两次存储过程 BEGIN TRANSACTION -- 通过变量来记录错误 【注意】@@ERROR是错误编码而不是错误数 DECLARE @sumError INT = 0; --执行存储过程 EXECUTE dbo.proc_test @name='张三'; SET @sumError = @sumError+@@ERROR -- 长度超过表格的50,超过存储过程变量的60 EXECUTE dbo.proc_test @name='李四asdfasdfasdfasdfasdfasdfasfasdfasdfasdfasdfasdfasdfasfasdfasdfasdfasdfasdfasdfasf'; SET @sumError = @sumError+@@ERROR EXECUTE dbo.proc_test @name='王五'; SET @sumError = @sumError+@@ERROR IF (@sumError <> 0) BEGIN --提交存储过程 ROLLBACK TRANSACTION END ELSE BEGIN --提交存储过程 COMMIT TRANSACTION END GO
优化方案二:
--用 TRY CATCH BEGIN TRY -- 在一个事务中执行两次存储过程 BEGIN TRANSACTION --执行存储过程 EXECUTE dbo.proc_test @name='张三'; -- 长度超过表格的50,超过存储过程变量的60 EXECUTE dbo.proc_test @name='李四asdfasdfasdfasdfasdfasdfasfasdfasdfasdfasdfasdfasdfasfasdfasdfasdfasdfasdfasdfasf'; EXECUTE dbo.proc_test @name='王五'; --提交存储过程 COMMIT TRANSACTION END TRY BEGIN CATCH --提交存储过程 ROLLBACK TRANSACTION END CATCH GO
参考:
Sql Server 中的 @@ERROR
Sql Server 中关于@@ERROR的一个小小误区
这篇关于MSSQL中,一个事务(TRANSACTION)中支持多次执行存储过程(PROCEDURE)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-01-08Docker下的SqlServer发布订阅启用
- 2023-06-05Docker安装MS SQL Server并使用Navicat远程连接
- 2023-05-25深入浅出 SQL Server CDC 数据同步
- 2023-05-12通过空间占用和执行计划了解SQL Server的行存储索引
- 2023-04-24以SQLserver为例的Dapper详细讲解
- 2022-11-30SQL server高级函数查询
- 2022-11-26SQL SERVER数据库服务器CPU不能全部利用原因分析
- 2022-11-21SQL Server 时间算差值/常用函数
- 2022-11-20调试Archery连接SQL Server提示驱动错误
- 2022-10-22SQL Server 完整、差异备份+完整、差异还原(详细讲解,规避错误)