2010-06-03 13 views
8

क्लाइंट जो इस कोड को कॉल करता है प्रतिबंधित है और केवल संग्रहित प्रोसेस से रिटर्न कोड से निपट सकता है। तो, हम RETURN 0 को RETURN -1 त्रुटि और डिफ़ॉल्ट पर करने के लिए हमारे सामान्य अनुबंध संशोधित करता है, तो कोई त्रुटिएसक्यूएल सर्वर संग्रहीत प्रक्रिया वापसी कोड विषमता

कोड भीतरी कैच ब्लॉक हिट है, तो रिटर्न कोड डिफ़ॉल्ट है -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 करने के लिए 'मछली' क्यों आवंटित कर रहे हैं? –

+0

बाहरी कैच ब्लॉक का परीक्षण करने के लिए अपवाद को मजबूर करने के लिए। अंतिम EXEC देखें ... – gbn

+0

खेद है कि मैंने आपके उत्तर को देखने से पहले ही मेरी टिप्पणी हटा दी है। (मेरी टिप्पणी वैसे भी फर्जी थी :) –

उत्तर

10

प्रक्रिया के साथ प्रयोग करना में, मैं, अगर मैं foo.KeyCol में एक अशक्त सम्मिलित एक एक वापसी -6 हो और भीतरी पकड़ में RAISERROR निकाल सकते हैं। यह कुछ ऐसा है जो SQL सर्वर कर रहा है, और यहां दस्तावेज़ित किया गया है: Return Values from Stored Procedures

+1

मैंने पहले भी उस लेख को पढ़ा है ... – gbn

+0

@ जीबीएन, यह इस प्रश्न में दिया गया था जिसे आपने उत्तर दिया: http://www.sommarskog.se/error-handling-I.html#returnvalue –

+1

[Erland यहां] (http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/b39cb2e5-3d49-4266-84dc-565b11ad0ffa/) कहता है कि वापसी मान त्रुटि के गंभीरता स्तर से 10 गुना है लेकिन मैं लिंक किए गए आलेख में वर्णित नहीं देख सकता। –

संबंधित मुद्दे