SQL 服务器存储过程到 运行 insert/update 事务中
SQL Server stored procedure to run insert/update in transaction
我必须执行带有插入和更新指令的 T-SQL 块。
假设我有这两个代码块,但我无法直接控制它们。
区块#1:
insert into mytable (id, col1)
values ((select max(id) + 1 from mytable), 'foo');
insert into non_existing_table (id, col1)
values ((select max(id) from mytable), 'bar');
第 2 块:
insert into mytable (id, col1)
values ((select max(id) + 1 from mytable), 'foo');
insert into anothertable (id, col1)
values ((select max(id) from mytable), 'bar');
在第一个块中有两个指令,第一个可以,第二个失败,因为第二个 table 不存在。
第二块也有两条指令,都可以。
我想做的是运行两个街区
- 第一个块最终应该什么都不做,因为第二个指令失败,第一个应该回滚
- 第二个块没问题,因为没有错误,应该提交两个插入
正确的做法是什么?也许是接受全文参数和 运行 所有代码作为事务的存储过程?我如何在 SQL 服务器中做到这一点?
您可以创建带有事务的存储过程。
像这样尝试。
CREATE PROCEDURE [dbo].[Procedure_name]
@iErrorCode int OUTPUT,
--other parameters
AS
BEGIN
BEGIN TRY
begin tran
insert into mytable (id,col1) values ((select max(id)+1 from mytable),'foo');
insert into non_existing_table (id,col1) values ((select max(id) from mytable),'bar');
--other queries
commit tran
SELECT @iErrorCode =@@ERROR;
END TRY
BEGIN CATCH
rollback tran
Select ERROR_NUMBER();
Select ERROR_MESSAGE();
SELECT @iErrorCode =@@ERROR
END CATCH
END
我必须执行带有插入和更新指令的 T-SQL 块。
假设我有这两个代码块,但我无法直接控制它们。
区块#1:
insert into mytable (id, col1)
values ((select max(id) + 1 from mytable), 'foo');
insert into non_existing_table (id, col1)
values ((select max(id) from mytable), 'bar');
第 2 块:
insert into mytable (id, col1)
values ((select max(id) + 1 from mytable), 'foo');
insert into anothertable (id, col1)
values ((select max(id) from mytable), 'bar');
在第一个块中有两个指令,第一个可以,第二个失败,因为第二个 table 不存在。
第二块也有两条指令,都可以。
我想做的是运行两个街区
- 第一个块最终应该什么都不做,因为第二个指令失败,第一个应该回滚
- 第二个块没问题,因为没有错误,应该提交两个插入
正确的做法是什么?也许是接受全文参数和 运行 所有代码作为事务的存储过程?我如何在 SQL 服务器中做到这一点?
您可以创建带有事务的存储过程。 像这样尝试。
CREATE PROCEDURE [dbo].[Procedure_name]
@iErrorCode int OUTPUT,
--other parameters
AS
BEGIN
BEGIN TRY
begin tran
insert into mytable (id,col1) values ((select max(id)+1 from mytable),'foo');
insert into non_existing_table (id,col1) values ((select max(id) from mytable),'bar');
--other queries
commit tran
SELECT @iErrorCode =@@ERROR;
END TRY
BEGIN CATCH
rollback tran
Select ERROR_NUMBER();
Select ERROR_MESSAGE();
SELECT @iErrorCode =@@ERROR
END CATCH
END