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

时间:2012-10-03 02:53:59

标签: sql sql-server-2008-r2

我有以下情况:存储过程收集数据并执行必要的连接并将结果插入临时表(例如:#Results)

现在,我想要做的是将#Results中的所有记录插入到先前创建的表中,但我首先要删除(截断/删除)目标,然后插入结果。问题在于清理目标表,然后在事务中插入新的#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

但是我知道它工作不正常而且我很难找到这样的例子,虽然我不知道为什么考虑它看起来像是常见的东西。在这种情况下,尽管插入失败,它仍会删除目标表。

最重要的是,一些指导会很好,以便最好地处理这种情况或类似情况下的最佳实践(最好使用等等)。提前谢谢你......

1 个答案:

答案 0 :(得分:1)

我真的没有看到任何错误。所以它从您的TransTable中删除,但不插入?你确定#RESULT中有记录吗?

我唯一看到的是你在@@ERROR之后检查Select @@TRANCOUNT TransactionCount, @@ERROR ErrorCount,这意味着@@ ERROR将来自你的SELECT语句,而不是INSERT语句(尽管我会永远期望是0)。

有关@@ ERROR的更多信息,请参阅:http://msdn.microsoft.com/en-us/library/ms188790.aspx

你应该在每个陈述后检查@@ ERROR。

就最佳实践而言,我认为Microsoft现在建议您在每个语句之后使用TRY / CATCH而不是检查@@ ERROR(从SQL 2005及之后)。请在此处查看示例B:http://msdn.microsoft.com/en-us/library/ms175976.aspx