如何正确使用事务范围进行简单的ETL过程?

时间:2014-08-04 08:31:43

标签: sql sql-server stored-procedures

这与SQL Server 2008有关。

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

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

我需要:

  1. 从缓存中删除所有现有数据。
  2. 选择所有业务分支到表中。
  3. 将所有销售部门选入表格
  4. 选择并转换实际数据。
  5. 如果2 - 4中的任何一个失败,那么我需要回滚并返回文本错误。这样缓存中的数据就像调用过程之前一样。
  6. 我看过: Stored Procedure Transaction

    我认为尝试,捕获可能有点矫枉过正。

    最佳做法是什么? 它就像使用

    一样简单
    BEGIN TRANSACTION
    
    -- Do stuff
    
    IF @@ERROR <> 0
        ROLLBACK TRANSACTION
    
    COMMIT TRANSACTION
    

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

2 个答案:

答案 0 :(得分:2)

我会使用以下方法:

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

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

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

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

答案 1 :(得分:1)

至于交易部分,我会尝试使用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