sql-server – 存储过程事务
发布时间:2020-12-12 16:09:03 所属栏目:MsSql教程 来源:网络整理
导读:我从来没有使用过交易,提交和回滚,现在我需要使用一个.我已经在网上检查了一些例子,以确保我实际上正确使用这个,但我仍然不确定我是否编码这个正确的.我希望有人可以审查并建议我,如果这似乎是正确的. 基本上我有一个应用程序的2个数据库.一个是存档 – 意味
我从来没有使用过交易,提交和回滚,现在我需要使用一个.我已经在网上检查了一些例子,以确保我实际上正确使用这个,但我仍然不确定我是否编码这个正确的.我希望有人可以审查并建议我,如果这似乎是正确的.
基本上我有一个应用程序的2个数据库.一个是存档 – 意味着不再被用户操纵的数据将被移动到这个数据库.但是,如果他们需要它,我将把所需的数据移回主数据库以供使用.我的存储过程如下: CREATE PROCEDURE [dbo].[spReopenClosed] ( @Return_Message VARCHAR(1024) = '' OUT,@IID uniqueidentifier,@OpenDate smalldatetime,@ReopenedBy uniqueidentifier ) AS BEGIN SET NOCOUNT ON; /****************************** * Variable Declarations *******************************/ DECLARE @ErrorCode int /****************************** * Initialize Variables *******************************/ SELECT @ErrorCode = @@ERROR IF @ErrorCode = 0 BEGIN TRANSACTION /**************************************************************************** * Step 1 * Copy the Closed from the Archive ****************************************************************************/ INSERT INTO OPS.dbo.SM_T_In SELECT FROM OPS_ARCHIVE.Archive.SM_T_In W WHERE W.GUID = @IID AND W.OpenDate = @OpenDate IF @ErrorCode <> 0 BEGIN -- Rollback the Transaction ROLLBACK RAISERROR ('Error in Copying from the archive',16,1) RETURN END /**************************************************************************** * Step 2 * copy the notes ****************************************************************************/ INSERT INTO OPS.dbo.SM_T_Notes SELECT FROM OPS_ARCHIVE.Archive.SM_T_Notes W WHERE W.GUID = @IID IF @ErrorCode <> 0 BEGIN -- Rollback the Transaction ROLLBACK RAISERROR ('Error in copying the notes',1) RETURN END /**************************************************************************** * Step 3 * Delete the from the Archive - this will also delete the notes ****************************************************************************/ DELETE FROM OPS_ARCHIVE.Archive.SM_T_In WHERE OPS_ARCHIVE.Archive.SM_T_In.GUID = @IID IF @ErrorCode <> 0 BEGIN -- Rollback the Transaction ROLLBACK RAISERROR ('Error in deleting the items from the Archive',1) RETURN END COMMIT BEGIN SELECT @ErrorCode = @@ERROR IF @ErrorCode = 0 SELECT @Return_Message = 'All data was moved over' END /************************************* * Get the Error Message for @@Error *************************************/ IF @ErrorCode <> 0 BEGIN SELECT @Return_Message = [Description] -- Return the SQL Server error FROM master.dbo.SYSMESSAGES WHERE error = @ErrorCode END /************************************* * Return from the Stored Procedure *************************************/ RETURN @ErrorCode -- =0 if success,<>0 if failure END 我有两个插入,从存档数据库的2个表移动数据.如果这些插入成功,那么我将从存档数据库中删除数据.我非常感谢任何有关这方面的反馈意见,我需要确保我正确地做到这一点. 谢谢 解决方法哦,我很快地重写你的SP使用概念TRY CATCH和TRANSACTION,如你所要求但我没有检查.此代码将在SQL 2005/2008中运行 如果这种反馈对您有用,请告诉我们 CREATE PROCEDURE [dbo].[spReopenClosed] ( @Return_Message VARCHAR(1024) = '' OUT,@ReopenedBy uniqueidentifier ) AS SET NOCOUNT ON; /****************************** * Variable Declarations *******************************/ DECLARE @ErrorCode int DECLARE @ErrorStep varchar(200) /****************************** * Initialize Variables *******************************/ SELECT @ErrorCode = @@ERROR BEGIN TRY BEGIN TRAN /**************************************************************************** * Step 1 * Copy the Closed from the Archive ****************************************************************************/ SELECT @ErrorStep = 'Error in Copying from the archive'; INSERT INTO OPS.dbo.SM_T_In SELECT * FROM OPS_ARCHIVE.Archive.SM_T_In WHERE GUID = @IID AND W.OpenDate = @OpenDate /**************************************************************************** * Step 2 * copy the notes ****************************************************************************/ SELECT @ErrorStep = 'Error in copying the notes' INSERT INTO OPS.dbo.SM_T_Notes SELECT * FROM OPS_ARCHIVE.Archive.SM_T_Notes WHERE GUID = @IID /**************************************************************************** * Step 3 * Delete the from the Archive - this will also delete the notes ****************************************************************************/ SELECT @ErrorStep = 'Error in deleting the items from the Archive' DELETE FROM OPS_ARCHIVE.Archive.SM_T_In WHERE OPS_ARCHIVE.Archive.SM_T_In.GUID = @IID COMMIT TRAN SELECT @ErrorCode = 0,@Return_Message = 'All data was moved over' /************************************* * Return from the Stored Procedure *************************************/ RETURN @ErrorCode -- =0 if success,<>0 if failure END TRY BEGIN CATCH /************************************* * Get the Error Message for @@Error *************************************/ IF @@TRANCOUNT > 0 ROLLBACK SELECT @ErrorCode = ERROR_NUMBER(),@Return_Message = @ErrorStep + ' ' + cast(ERROR_NUMBER() as varchar(20)) + ' line: ' + cast(ERROR_LINE() as varchar(20)) + ' ' + ERROR_MESSAGE() + ' > ' + ERROR_PROCEDURE() /************************************* * Return from the Stored Procedure *************************************/ RETURN @ErrorCode -- =0 if success,<>0 if failure END CATCH (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |