La procedura memorizzata di SQL Server restituisce la stranezza del codice

Il client che chiama questo codice è limitato e può gestire solo i codici di ritorno dai proc memorizzati. Quindi, abbiamo modificato il nostro consueto contratto a RETURN -1 in caso di errore e di default a RETURN 0 se nessun errore

Se il codice colpisce il blocco catch interno, il valore predefinito del codice RETURN è -4 anziché 0

Qualcuno sa da dove viene questo per favore? Con riferimento

Saluti 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', '', 'testing' SELECT @rtn; SELECT * FROM dbo.foo GO DECLARE @rtn int EXEC @rtn = dbo.bar 'abcdefghijkl', '', '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', '', 'testing' --Hit outer CATCH, @rtn = -1 as expected SELECT @rtn; SELECT * FROM dbo.foo 

Giocando con la procedura, posso ottenere un return -6, se inserisco un null in foo.KeyCol e rimuovo RAISERROR nel catch interno. Questo è qualcosa che sta facendo SQL Server, ed è documentato qui: Valori di ritorno da stored procedure .