RAISERROR 不能在 CATCH 内部使用 ROLLBACK TRANSACTION

RAISERROR Dosn't Work Inside CATCH With ROLLBACK TRANSACTION

我创建了一个存储过程插入到 2 Table 使用事务来确保两个插入都完成并且我使用 TRY 和 CATCH 来处理错误..问题出在我放置 ROLLBACK 的 Catch 语句中TRANS 和 RAISERROR RoLLBACK 有效但程序剂量不 RAISERROR 这是代码

ALTER PROC SP_InsertPlot
@PlotName nvarchar(50),
@GrossArea int,
@SectorName Nvarchar(50),
@PlotYear int,
@OwnerName Nvarchar(50),
@Remarks text,
@NumberOfPlants INT,
@NetArea INT,
@Category Nvarchar(50),
@Type Nvarchar(50),
@Variety Nvarchar(50),
@RootStock Nvarchar(50),
@PlantDistance Decimal(18,2)
AS
BEGIN
DECLARE @PlotID INT
SET @PlotID = (SELECT ISNULL(MAX(PlotID),0) FROM Plots) + 1 

DECLARE @SectorID INT 
SET @SectorID = (SELECT SectorID FROM Sectors WHERE SectorName = @SectorName)

DECLARE @OwnerID INT 
SET @OwnerID = ( SELECT OwnerID FROM Owners WHERE OwnerName = @OwnerName)

DECLARE @CategoryID INT
SET @CategoryID = (SELECT CategoryID FROM Categories WHERE CategoryName = @Category)

DECLARE @TypeID INT 
SET @TypeID = (SELECT TypeID FROM Types WHERE TypeName = @Type)

DECLARE @VarietyID INT
SET @VarietyID = (SELECT VarietyID FROM Varieties WHERE VarietyName = @Variety)

DECLARE @RootStockID INT 
SET @RootStockID = (SELECT RootStockID FROM RootStocks WHERE RootStockName = @RootStock)

DECLARE @PlotDescID INT
SET @PlotDescID = (SELECT ISNULL(MAX(PlotDescID),0) FROM PlotDescriptionByYear) + 1

BEGIN TRY
    SET XACT_ABORT ON
    SET NOCOUNT ON

    IF(SELECT Count(*) FROM Plots WHERE PlotName = @PlotName) = 0
    BEGIN
    BEGIN TRANSACTION
    INSERT INTO Plots (PlotID,PlotName,GrossArea,SectorID,PlantYear,OnwerID,Remarks)
        VALUES(@PlotID,@PlotName,@GrossArea,@SectorID,@PlotYear,@OwnerID,@Remarks)


    INSERT INTO PlotDescriptionByYear (PlotDescID, PlantYear, NumberOfPlants,PlotID,NetArea,CategoryID,TypeID,VarietyID,RootStockID,PlantDistance) 
        VALUES(@PlotDescID,YEAR(GETDATE()),@NumberOfPlants,@PlotID -1,@NetArea,@CategoryID,@TypeID,@VarietyID,@RootStockID,@PlantDistance)
    COMMIT TRANSACTION
    END

END TRY

BEGIN CATCH
        IF(XACT_STATE())= -1
        BEGIN
        ROLLBACK TRANSACTION
        RAISERROR('This Plot Is Already Exists !!',11,1)
        END
END CATCH

END

顺便说一下,我尝试更改严重性,我尝试使用@@TRANCOUNT 而不是 XACT_STATE 并且发生了同样的问题,即当我执行 Proc 并将现有数据传递给参数时事务回滚并没有出现错误

IF(XACT_STATE())= -1改为IF(XACT_STATE()) <> 0,你的问题就解决了。