2010-06-03 26 views
8

調用此代碼的客戶端受到限制,只能處理來自存儲的特定代碼的返回代碼。所以,我們修改我們平常合同RETURN -1上的錯誤和默認RETURN 0如果沒有錯誤SQL Server存儲過程返回代碼奇怪

如果代碼打內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 
+0

你爲什麼將「魚」分配給tinyint? – 2010-06-03 10:55:58

+0

強制執行異常以測試外部CATCH塊。看到最後一個EXEC ... – gbn 2010-06-03 11:01:55

+0

抱歉,在我看到您的回覆之前,我已刪除了我的評論。 (我的評論是虛假的:) – 2010-06-03 11:22:33

回答

10

與程序玩弄,我可以得到回報-6,如果我插入一個空到foo.KeyCol並取出RAISERROR的內抓住。這是SQL Server正在做的事情,這裏記錄:Return Values from Stored Procedures

+1

我以前也讀過那篇文章... – gbn 2010-06-03 12:01:50

+0

@gbn,它在這個問題中給出,你也回答了:http://www.sommarskog.se/error-handling-I.html#returnvalue – 2010-06-03 12:21:30

+1

[Erland這裏](http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/b39cb2e5-3d49-4266-84dc-565b11ad0ffa/)說,返回值是10減去錯誤的嚴重性級別但我無法看到鏈接文章中提到的內容。 – 2012-01-09 23:15:40