क्लाइंट जो इस कोड को कॉल करता है प्रतिबंधित है और केवल संग्रहित प्रोसेस से रिटर्न कोड से निपट सकता है। तो, हम 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
आप एक tinyint करने के लिए 'मछली' क्यों आवंटित कर रहे हैं? –
बाहरी कैच ब्लॉक का परीक्षण करने के लिए अपवाद को मजबूर करने के लिए। अंतिम EXEC देखें ... – gbn
खेद है कि मैंने आपके उत्तर को देखने से पहले ही मेरी टिप्पणी हटा दी है। (मेरी टिप्पणी वैसे भी फर्जी थी :) –