DhananjayanP Ответов: 1

Откат Трана не работает


Привет, я новичок в SQL может ли кто-нибудь помочь мне, как работать ROLLBACK TRAN. мой код не работает, а также мне нужно использовать try-catch block может ли кто-нибудь изменить его.


ALTER PROCEDURE [dbo].[TransferEquipmentAndProductData_Act2Store] 
	-- Add the parameters for the stored procedure here
	@DocumentGUID varchar(36),
	@UserID int
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
--
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
--
DECLARE @TransactionName varchar(max)
Set @TransactionName = 'Transaction_TransferEquipmentProductData'
--Begin Transaction
BEGIN TRAN @TransactionName
------------------------------------------------------------
--

--
BEGIN
--
IF  EXISTS (Select camosGUID from cC_EquipmentData_Stor with (nolock) where DocumentGUID = @DocumentGUID)
			BEGIN
			DELETE FROM cC_EquipmentData_Stor WHERE [DocumentGUID] = @DocumentGUID
			end
IF EXISTS (SELECT * FROM cC_ProductData_Stor WHERE DocumentGUID = @DocumentGUID)
			BEGIN
			DELETE FROM cC_ProductData_Stor WHERE DocumentGUID = @DocumentGUID
			end


--
insert into cC_EquipmentData_Stor
				(camosguid, datenew, usernew, DocumentGUID, clone, oldCamosGUID,
				Quantity, ItemLocked, EquipmentLoaded, ItemNo, Consistency, TenderLetterXMLBin, EquipmentBlob)
				select camosguid, getdate(), @UserID, @DocumentGUID, clone, oldCamosGUID,
				Quantity, ItemLocked, EquipmentLoaded, ItemNo, Consistency, TenderLetterXMLBin, EquipmentBlob
		from cC_EquipmentData_Act where DocumentGUID = @DocumentGUID 



insert into cC_ProductData_Stor
			(camosGUID, DateNew, UserNew, DocumentGUID, EquipmentGUID,SolutionGUID,ProductGUID,ProductName,
			SolutionState,NCP,NetworkNumber,NetworkDescription,consistency,ProductPosNo,clone,oldCamosGUID)
			select camosGUID, getdate(), @UserID, @DocumentGUID,EquipmentGUID,SolutionGUID,ProductGUID,ProductName,
			SolutionState,NCP,NetworkNumber,NetworkDescription,consistency,ProductPosNo,clone,oldCamosGUID 
			from cC_ProductData_Act where DocumentGUID = @DocumentGUID 
--
END
--
IF @@ERROR <> 0 
    BEGIN
        -- Return 0 to the calling program to indicate failure.
        ROLLBACK TRAN @TransactionName
        Select 0 as ReturnState;
    END
ELSE
    BEGIN
        -- Return 1 to the calling program to indicate success.
        COMMIT TRAN @TransactionName
        Select 1 as ReturnState;
    END
END 


Что я уже пробовал:

ROLLBACK TRAN
Не работать

CHill60

Что вы подразумеваете под словом "не работает"? Есть ли сообщение об ошибке или это просто данные сохраняются в базе данных

#realJSOP

Вы также можете объявить имя транзакции как 32 символа, потому что используются только первые 32 символа. Кроме того, я бы использовал уникальный идентификатор вместо жестко закодированной строки.

declare @transactionName nvarchar(32) = REPLACE(NEWID(),'-',")

Он гарантированно будет уникальным каждый раз, когда вы вызываете сохраненный proc, что позволяет избежать возможных проблем с параллелизмом.

Rajesh Pandya

Для реализации try catch в хранимой процедуре проверьте ссылку ниже:
https://docs.microsoft.com/en-us/sql/t-sql/language-elements/try-catch-transact-sql

1 Ответов

Рейтинг:
2

David C. Williams

Переменная @@error сообщает вам только о том, была ли ошибка в предыдущем операторе SQL, поэтому прямо сейчас вы проверяете только последний оператор INSERT на наличие ошибок, а не первую вставку или два удаления.

видеть @@ошибка в SQL Docs за дополнительной информацией