这与SQL Server 2008有关。
我正在编写一个过程,将数据从生产数据库移动到定期缓存数据库以用于BI。
两个数据库都在同一个SQL实例上,因此我打算在此阶段避免使用SSIS。
我需要:
我看过: 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?
答案 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