Sql server 删除记录前插入到的错误处理程序
我有带应用程序的SQL Server表,并使用链接服务器将数据推送到oracle表第三方。我想设置一个错误处理程序,如果插入不成功,删除查询将不会执行。下面是我每24小时在SQLServer代理中运行的查询Sql server 删除记录前插入到的错误处理程序,sql-server,Sql Server,我有带应用程序的SQL Server表,并使用链接服务器将数据推送到oracle表第三方。我想设置一个错误处理程序,如果插入不成功,删除查询将不会执行。下面是我每24小时在SQLServer代理中运行的查询 DELETE FROM oracle_tbl -如果插入不成功,则回滚其他提交- INSERT INTO oracle_tbl SELECT* FROM sqlserver_tbl 下面是一个存储过程的概要,它将演示您正在寻找的行为。如果插入不成功,即插入0行,则会引发异常,该异常将触发
DELETE FROM oracle_tbl
-如果插入不成功,则回滚其他提交-
INSERT INTO oracle_tbl
SELECT*
FROM
sqlserver_tbl
下面是一个存储过程的概要,它将演示您正在寻找的行为。如果插入不成功,即插入0行,则会引发异常,该异常将触发包含rollback语句的CATCH块。如果插入成功,则执行DELETE语句
drop proc if exists dbo.stored_procedure_name;
go
create proc dbo.stored_procedure_name
@input nvarchar(max)=null,
@test_id bigint output,
@response nvarchar(max) output
as
set nocount on;
set xact_abort on;
begin transaction
begin try
declare
@o_id bigint,
@o_count bigint;
/* attempt to insert into table */
INSERT INTO oracle_tbl
SELECT *
FROM
sqlserver_tbl;
select @o_count=rowcount_big();
select @o_id=cast(scope_identity() as bigint);
/* if the insert failed, then throw an exception which rollback the transaction */
if @o_count<>1
throw 50000, 'No rows inserted', 1;
/* delete from table */
DELETE FROM oracle_tbl;
select
@test_id=@o_id,
@response=(select N'Ok' reply_message, @o_id o_id for json path, without_array_wrapper);
commit transaction;
end try
begin catch
select
@test_id=cast(0 as bigint),
@response=error_message() for json path, without_array_wrapper);
rollback transaction;
end catch
go
那么你的问题是什么?我不想问任何事。你想解决的问题是什么,为什么你的东西不起作用?您是如何试图解决此问题的?我对误解表示歉意,我想要的是,如果INSERT INTO失败,那么将不会执行DELETE查询。是否有其他方法来处理错误?假设删除记录而不提交如果插入成功,则删除将被提交,否则删除不提交…类似的事情…如果在插入之后删除,则插入失败时不会执行。我提出了以下语法BEGIN TRAN delete FROM oracle\u tbl,然后从sqlserver插入oracle\u tbl\u tbl如果插入然后成功开始从oracle删除事务\u tbl提交事务,否则开始从oracle删除事务\u tbl回滚事务,但我无法将这些合并到一个查询中…您有2个事务。你应该有一个,还有一个尝试…接住障碍。嗨,史蒂夫C,我来试试。非常感谢。