代码之家  ›  专栏  ›  技术社区  ›  niaher

SQL事务错误处理

  •  0
  • niaher  · 技术社区  · 14 年前

    你们认为我处理以下存储过程中错误的方式有什么问题吗?我对SQL仍然没有足够的信心来意识到我是否做错了什么。谢谢:)

    CREATE PROCEDURE [dbo].[UserAccounts_Create]
        @username varchar(255),
        @email varchar(255),
        @password nvarchar(127),
        @id bigint OUTPUT
    AS
    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;
        SET XACT_ABORT ON;
    
        DECLARE @now smalldatetime
        SET @now = GETDATE()
    
        DECLARE @userId bigint
        DECLARE @transactionSuccess bit
        SET @transactionSuccess = 0
    
        BEGIN TRANSACTION       
            INSERT INTO UserAccounts([username], [email], [password], [createDate], [lastLoginDate])
                VALUES (@username, @email, @password, @now, @now)
    
            SET @userId = SCOPE_IDENTITY()
    
            INSERT INTO Users([id], [firstName], [lastName])
                VALUES (@userId, '', '')
    
            SET @transactionSuccess = 1;
    
        COMMIT TRANSACTION
    
        IF (@transactionSuccess = 1)
            RETURN 0; -- Success.
        ELSE
            RETURN 1; -- Some unknown error occured.
    END
    
    2 回复  |  直到 14 年前
        1
  •  3
  •   Dave Markle    14 年前

    如果您遇到导致您中止的错误, RETURN 1;

    与其使用这种语法,为什么不试试新的(ish)

    BEGIN TRY
    ...
    END TRY
    BEGIN CATCH
    ...
    END CATCH
    

    语法?它给了你更多的控制,而且(依我看)更容易阅读。

        2
  •  1
  •   Adriaan Stander    14 年前

    我建议你看看 TRY...CATCH (Transact-SQL)

    开始交易 提交事务 回降 在发生错误的情况下。