Sql server 删除记录前插入到的错误处理程序

Sql server 删除记录前插入到的错误处理程序,sql-server,Sql Server,我有带应用程序的SQL Server表,并使用链接服务器将数据推送到oracle表第三方。我想设置一个错误处理程序,如果插入不成功,删除查询将不会执行。下面是我每24小时在SQLServer代理中运行的查询 DELETE FROM oracle_tbl -如果插入不成功,则回滚其他提交- INSERT INTO oracle_tbl SELECT* FROM sqlserver_tbl 下面是一个存储过程的概要,它将演示您正在寻找的行为。如果插入不成功,即插入0行,则会引发异常,该异常将触发

我有带应用程序的SQL Server表,并使用链接服务器将数据推送到oracle表第三方。我想设置一个错误处理程序,如果插入不成功,删除查询将不会执行。下面是我每24小时在SQLServer代理中运行的查询

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,我来试试。非常感谢。