gpt4 book ai didi

sql-server - 存储过程事务

转载 作者:行者123 更新时间:2023-12-02 04:47:17 25 4
gpt4 key购买 nike

我以前从未使用过事务、提交和回滚,现在我需要使用一个。我已经在网上检查了一些示例,以确保我实际上正确使用了它,但我仍然不确定我的编码是否正确。我希望有人能够审查并建议我这是否正确。

基本上我的一个应用程序有 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', 16, 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', 16, 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 个表中移动数据。如果这些插入成功,那么我将从存档数据库中删除数据。如果您对此有任何反馈,我将不胜感激,我需要确保我做得正确。

谢谢

最佳答案

哦,好吧,我按照您的要求使用TRY CATCH 和 TRANSACTION 概念快速重写了您的 SP,但我没有检查它。

此代码适用于SQL 2005/2008

请告诉我此反馈是否对您有用

CREATE PROCEDURE [dbo].[spReopenClosed] 
(
@Return_Message VARCHAR(1024) = '' OUT,
@IID uniqueidentifier,
@OpenDate smalldatetime,
@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

关于sql-server - 存储过程事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6252757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com