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

SQL Server存储过程返回代码异常

  •  8
  • gbn  · 技术社区  · 15 年前

    RETURN -1 关于错误和 RETURN 0 如果没有错误

    如果代码命中内部catch块,那么返回代码的默认值是-4,而不是0

    有人知道这是从哪里来的吗?参考

    干杯 gbn公司

    IF OBJECT_ID('dbo.foo') IS NOT NULL DROP TABLE dbo.foo
    GO
    CREATE TABLE dbo.foo (
        KeyCol  char(12) NOT NULL,
        ValueCol xml NOT NULL,
        Comment varchar(1000) NULL,
        CONSTRAINT PK_foo PRIMARY KEY CLUSTERED (KeyCol)
    )
    GO
    
    IF OBJECT_ID('dbo.bar') IS NOT NULL DROP PROCEDURE dbo.bar
    GO
    CREATE PROCEDURE dbo.bar
        @Key char(12),
        @Value xml,
        @Comment varchar(1000)
    AS
    SET NOCOUNT ON
    DECLARE @StartTranCount tinyint;
    BEGIN TRY
        SELECT @StartTranCount = @@TRANCOUNT;
    
        IF @StartTranCount = 0 BEGIN TRAN;
    
        BEGIN TRY
            --SELECT @StartTranCount = 'fish' --generates an error and goes to outer CATCH
            INSERT dbo.foo (KeyCol, ValueCol, Comment) VALUES (@Key, @Value, @Comment);
        END TRY
        BEGIN CATCH
            IF ERROR_NUMBER() = 2627    --PK violation
                UPDATE
                    dbo.foo
                SET
                    ValueCol = @Value, Comment = @Comment
                WHERE
                    KeyCol = @Key;
            ELSE
                RAISERROR ('Tits up', 16, 1);
        END CATCH
    
        IF @StartTranCount = 0 COMMIT TRAN;
    END TRY
    BEGIN CATCH
        IF @StartTranCount = 0 AND XACT_STATE() <> 0 ROLLBACK TRAN;
        RETURN -1
    END CATCH
    --Without this, we'll send -4 if we hit the UPDATE CATCH block above
    --RETURN 0
    GO
    
    --please run these **separately**
    
    --Run with RETURN 0 and fish line commented out
    DECLARE @rtn int
    EXEC @rtn = dbo.bar 'abcdefghijkl', '<foobar />', 'testing'
    SELECT @rtn; SELECT * FROM dbo.foo
    GO
    
    DECLARE @rtn int
    EXEC @rtn = dbo.bar 'abcdefghijkl', '<foobar2 />', 'testing2'
    --updated OK but we get @rtn = -4
    SELECT @rtn; SELECT * FROM dbo.foo
    GO
    
    --uncomment fish line
    DECLARE @rtn int
    EXEC @rtn = dbo.bar 'abcdefghijkl', '<foobar />', 'testing'
    --Hit outer CATCH, @rtn = -1 as expected
    SELECT @rtn; SELECT * FROM dbo.foo
    
    1 回复  |  直到 15 年前
        1
  •  10
  •   KM.    15 年前