【问题标题】:How do I correctly use Transaction Scope for simple ETL process?如何正确使用 Transaction Scope 进行简单的 ETL 流程?
【发布时间】:2014-08-04 08:31:42
【问题描述】:

这与 SQL Server 2008 有关。

我正在编写一个用于将数据从生产数据库移动到定期缓存数据库以用于 BI 的过程。

两个数据库都在同一个 SQL 实例上,因此我计划在这个阶段避免使用 SSIS。

我需要:

  1. 从缓存中删除所有现有数据。
  2. 将所有业务分支选择到一个表中。
  3. 在表格中选择所有销售部门
  4. 选择并转换实际数据。
  5. 如果 2 - 4 中的任何一个失败,那么我需要回滚并返回一个文本错误。以便缓存中的数据保持调用过程之前的状态。

我看过: Stored Procedure Transaction

我认为 try, catch 可能有点矫枉过正。

这方面的最佳做法是什么? 是不是像使用一样简单

BEGIN TRANSACTION

-- Do stuff

IF @@ERROR <> 0
    ROLLBACK TRANSACTION

COMMIT TRANSACTION

编辑 - 这篇文章也非常有用: How does SQL Server treat statements inside stored procedures with respect to transactions?

【问题讨论】:

    标签: sql sql-server stored-procedures


    【解决方案1】:

    我会使用以下方法:

    首先,我会在存储过程中使用 TRY CATCH 语法。

    我不会删除所有现有数据,而是重命名表(缓存、业务分支和销售部门)并创建具有相同名称和格式的新表。 我不确定第 4 步有多复杂。但如果它相当简单,我会将它放在 TRY CATCH 块内的单独事务中以允许回滚。

    如果任何代码块失败,它将跳转到 CATCH 部分。在该部分中,我将回滚第 4 步(如果需要),删除新创建的表并重命名旧表。

    编辑:如果没有任何错误,删除重命名的表。

    【讨论】:

      【解决方案2】:

      至于事务部分,我会使用 try catch 解决方案来处理事务范围

      http://msdn.microsoft.com/en-us/library/ms175976.aspx

      BEGIN TRANSACTION;
      
      BEGIN TRY
          -- Generate a constraint violation error.
          DELETE FROM Production.Product
          WHERE ProductID = 980;
      END TRY
      BEGIN CATCH
          SELECT 
              ERROR_NUMBER() AS ErrorNumber
              ,ERROR_SEVERITY() AS ErrorSeverity
              ,ERROR_STATE() AS ErrorState
              ,ERROR_PROCEDURE() AS ErrorProcedure
              ,ERROR_LINE() AS ErrorLine
              ,ERROR_MESSAGE() AS ErrorMessage;
      
          IF @@TRANCOUNT > 0
              ROLLBACK TRANSACTION;
      END CATCH;
      
      IF @@TRANCOUNT > 0
          COMMIT TRANSACTION;
      GO
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-29
        • 2023-03-06
        • 1970-01-01
        相关资源
        最近更新 更多