SQL事务重复条目

时间:2012-02-08 01:25:17

标签: sql-server sql-server-2008

这是我第一次使用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 

3 个答案:

答案 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