这是我第一次使用IF Exists和BEGIN TRANSACTION。我在If Exists部分的“错误语法附近”中出现错误,并且在“结束事务”结束时“事务”附近的语法不正确。如果存在重复的条目,并且如果有错误回滚事务并返回错误或返回@@ RowCount我不知道应该选择哪一个可以有人纠正我的程序并使请对它进行任何调整。
BEGIN TRANSACTION
IF EXISTS (SELECT * FROM Forums WHERE Title = @Title)
BEGIN
RAISERROR ('Duplicate Entry', 16, 1)
END
ELSE
BEGIN
INSERT INTO Forums(AddedBy, AddedDate, Title, Description,
ParentID, Moderated, ImageUrl, UpdatedBy, UpdatedDate, Active, Importance)
VALUES(@AddedBy, @AddedDate, @Title, null, null, False, null, null, null, True, 0)
RETURN @@ROWCOUNT
END
IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION
RETURN @@ERROR
END
END TRANSACTION
答案 0 :(得分:1)
除非您想强制执行隔离级别,或者如果您有多个Update / Insert / Delete语句,并且需要在发生错误时将它们全部回滚,或者如果发生错误,则不需要事务处理一切都很成功,
在示例代码中,您有一个甚至无法执行的insert语句,因此您无需回滚
DECLARE @InsertedRows INT = 0
INSERT INTO Forums(AddedBy, AddedDate, Title, Description, ParentID,
Moderated, ImageUrl, UpdatedBy, UpdatedDate, Active, Importance)
SELECT @AddedBy, @AddedDate, @Title, null, null, 'False', null, null, null, 'True', 0
WHERE NOT EXISTS (SELECT * FROM Forums WHER Title = @Title)
SET @InsertedRows = @@ROWCOUNT
IF @InsertedRows = 1
RETURN 1
ELSE
RETURN -1
答案 1 :(得分:0)
BEGIN TRANSACTION
IF EXISTS (SELECT * FROM Forums WHERE Title = @Title)
BEGIN
RAISERROR ('Duplicate Entry', 16, 1)
END
ELSE
BEGIN
INSERT INTO Forums(AddedBy, AddedDate, Title, Description, ParentID,
Moderated, ImageUrl, UpdatedBy, UpdatedDate, Active, Importance)
VALUES(@AddedBy, @AddedDate, @Title, null, null, False, null, null, null, True, 0)
COMMIT TRANSACTION
RETURN @@ROWCOUNT
END
IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION
RETURN @@ERROR
END
答案 2 :(得分:0)
你真的不需要这笔交易。单行插入要么成功要么失败(在这种情况下@@ROWCOUNT
只会返回1)。如果你对标题栏有一个独特的限制(显然你应该有),你也不需要先检查,尽管这样做可能会更有效(我必须执行一些)测试确认,但我很确定错误机制非常昂贵)。无论如何,这里是一个带错误处理的版本,以防除了标题上的约束违规之外出现问题:
IF EXISTS (SELECT 1 FROM dbo.Forums WHERE Title = @Title)
BEGIN
RAISERROR('Duplicate entry', 16, 1);
RETURN 2627; -- key constraint violation
END
ELSE
BEGIN
BEGIN TRY
INSERT dbo.Forums
(
AddedBy, AddedDate, Title,
Description, ParentID,
Moderated, ImageUrl, UpdatedBy,
UpdatedDate, Active, Importance
)
SELECT
@AddedBy,
@AddedDate,
@Title,
NULL, NULL,
'False', -- did you mean 0?
NULL, NULL, NULL,
'True', -- did you mean 1?
0;
RETURN 1;
END TRY
BEGIN CATCH
DECLARE @msg NVARCHAR(4000) = 'Insert failed ' + ERROR_MESSAGE();
RAISERROR(@msg, 16, 1);
RETURN ERROR_NUMBER();
END CATCH
END