Sql 在事务中删除然后插入到目标表

Sql 在事务中删除然后插入到目标表,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我遇到了以下情况:存储过程收集数据,执行必要的联接,并将结果插入临时表ex:results 现在,我要做的是将结果中的所有记录插入到以前创建的表中,但我首先要删除、截断/删除目标,然后插入结果。捕获是将清理目标表的过程放入事务中,然后将新结果插入事务中 我做了以下工作: BEGIN TRANSACTION DELETE FROM PracticeDB.dbo.TransTable IF @@ERROR <> 0 ROLLBACK TRANSACTION ELSE

我遇到了以下情况:存储过程收集数据,执行必要的联接,并将结果插入临时表ex:results

现在,我要做的是将结果中的所有记录插入到以前创建的表中,但我首先要删除、截断/删除目标,然后插入结果。捕获是将清理目标表的过程放入事务中,然后将新结果插入事务中

我做了以下工作:

BEGIN TRANSACTION

DELETE  FROM PracticeDB.dbo.TransTable

IF @@ERROR <> 0 
    ROLLBACK TRANSACTION
ELSE 
    BEGIN

        INSERT  INTO PracticeDB.dbo.TransTable
                ( 
                   [R_ID]
                  ,[LASTNAME]
                  ,[FIRSTNAME]
                  ,[DATASOURCE]
                  ,[USER_STATUS]
                  ,[Salary]
                  ,[Neet_Stat]
                )
                SELECT  [R_ID]
                      ,[LASTNAME]
                      ,[FIRSTNAME]
                      ,[DATASOURCE]
                      ,[USER_STATUS]
                      ,[Salary]
                      ,[Neet_Stat]
                FROM    #RESULT

        Select @@TRANCOUNT TransactionCount, @@ERROR ErrorCount
        IF @@ERROR <> 0 
            ROLLBACK TRANSACTION

        ELSE 
            COMMIT TRANSACTION

    END
但是我知道它不能正常工作,我很难找到这样一个例子,尽管我不知道为什么考虑它看起来像是一件普通的事情。在这种情况下,尽管插入失败,它仍然会删除目标表


最重要的是,最好能提供一些指导,以便最好地处理这种情况,或者在类似情况下提供最佳实践,例如什么是最好的使用方法等等。提前谢谢你…

我真的看不出这有什么问题。所以它确实从TransTable中删除,但不执行插入?您确定结果中有记录吗

我看到的唯一一件事是,您在选择@TRANCOUNT TransactionCount之后检查了@ERROR,@@ERROR ErrorCount,这意味着@ERROR将来自Select语句,而不是INSERT语句,尽管我总是希望它是0

有关@错误的详细信息,请参阅:

您应该在每条语句后检查@错误


就最佳实践而言,我认为Microsoft现在建议您使用TRY/CATCH,而不是在SQL 2005及其后的每个语句后检查@错误。请看示例B:

谢谢您的快速回复。是的,出于某种原因,它首先会删除目标表,但随后会在插入时遇到错误,结果是目标表为空并出现错误。现在似乎工作正常,可能正如您所说,结果表当时是空的。关于返回@@Error值,感谢您提出这个问题。这可能是因为COMMIT事务正在运行。在执行SELECT@@错误后立即检查@错误,该错误已成功运行@@错误检查上一条语句,在本例中是SELECT语句,而不是INSERT语句。知道我的意思吗?是的,我明白。再次感谢您的快速回复