2

我有以下情况,其中存储过程收集数据并执行必要的连接并将结果插入临时表(例如:#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

但我知道它不能正常工作,我很难找到这样的例子,虽然我不知道为什么考虑到它似乎很常见。在这种情况下,尽管插入失败,它仍然会删除目标表。

最重要的是,一些指导会很好地解决这种情况或类似情况下的最佳实践(最好使用什么等等)。先感谢您...

4

1 回答 1

1

我真的没有看到这有什么问题。所以它确实从您的 TransTable 中删除,但不进行插入?您确定#RESULT 中有记录吗?

我唯一看到的是,您正在检查@@ERRORafter 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

于 2012-10-03T03:04:36.493 回答