こんにちは、その中に「pro_reallocate_block」プロシージャを書いています。別のプロシージャ「pro_remove_allocation」を呼び出しています。メイン プロシージャ「pro_reallocate_block」に BEGIN TRANSACTION を配置すると、メイン プロシージャでエラーが発生した場合に、サブ プロシージャ「pro_remove_allocation」が元に戻ります。
Create procedure pro_reallocate_block(
@blockId int,
@blockName nvarchar(max)
)
WITH EXECUTE AS CALLER
AS
Begin
SET XACT_ABORT, NOCOUNT ON;
BEGIN TRY
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
Declare @AllocatedBlockid int
exec pro_remove_allocation @blockId
if((select COUNT(blockId) from blocks where blockId=@blockId)>0)
select * from blocks where blockId=@blockId
else
select * from blocks where bdefault=1
COMMIT TRANSACTION
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
BEGIN
ROLLBACK TRANSACTION
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT @ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
END
END CATCH
end