【发布时间】:2016-01-05 01:07:14
【问题描述】:
我创建了一个存储过程来插入到带有事务的 2 个表中,以确保两个插入都完成,并且我使用 TRY 和 CATCH 来处理错误。问题出在 Catch 语句中,我将 ROLLBACK 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 并将现有数据传递给参数时事务回滚并且没有引发错误
【问题讨论】:
标签: sql sql-server tsql transactions try-catch