Причуда кода возврата хранимой процедуры SQL Server

Клиент, который называет этот код, ограничивается и может только иметь дело с кодами возврата от сохраненного procs. Так, мы изменили наш обычный контракт к RETURN -1 на ошибке и значении по умолчанию к RETURN 0 если никакая ошибка

Если код поражает внутренний блок выгоды, то значение по умолчанию КОДА ВОЗВРАТА-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
8
задан gbn 3 June 2010 в 11:25
поделиться

1 ответ

Играя с процедурой, я могу получить return -6, если я вставлю нуль в foo.KeyCol и удалю RAISERROR во внутреннем улове. Это то, что делает SQL Server, и это описано здесь: Возвращаемые значения из хранимых процедур .

10
ответ дан 5 December 2019 в 17:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: