नीचे दिखाए गए एक सूक्ष्म अंतर है।
पहले सेटअप निम्नलिखित:
CREATE TABLE TMP
(ROW_ID int NOT NULL,
ALTER TABLE TMP ADD CONSTRAINT PK_TMP PRIMARY KEY CLUSTERED (ROW_ID)
)
GO
CREATE PROC pTMP1
AS
BEGIN TRY
INSERT INTO TMP VALUES(1)
INSERT INTO TMP VALUES(1)
INSERT INTO TMP VALUES(2)
END TRY
BEGIN CATCH
DECLARE @ErrMsg varchar(max)= ERROR_MESSAGE(),
@ErrSev int = ERROR_SEVERITY(),
@ErrState int = ERROR_STATE()
RAISERROR (@ErrMsg, @ErrSev, @ErrState)
END CATCH
GO
CREATE PROC pTMP2
AS
INSERT INTO TMP VALUES(1)
INSERT INTO TMP VALUES(1)
INSERT INTO TMP VALUES(2)
GO
अब चलाने के निम्नलिखित:
SET NOCOUNT ON
DELETE TMP
exec pTMP1
SELECT * FROM TMP
DELETE TMP
exec pTMP2
SELECT * FROM TMP
SET NOCOUNT OFF
--Cleanup
DROP PROCEDURE pTMP1
DROP PROCEDURE pTMP2
DROP TABLE TMP
आप निम्न परिणाम प्राप्त करना चाहिए:
Msg 50000, Level 14, State 1, Procedure pTMP1, Line 12
Violation of PRIMARY KEY constraint 'PK_TMP'. Cannot insert duplicate key in object 'dbo.TMP'. The duplicate key value is (1).
ROW_ID
-----------
1
Msg 2627, Level 14, State 1, Procedure pTMP2, Line 4
Violation of PRIMARY KEY constraint 'PK_TMP'. Cannot insert duplicate key in object 'dbo.TMP'. The duplicate key value is (1).
The statement has been terminated.
ROW_ID
-----------
1
2
सूचना है कि TRY..CATCH
संस्करण निष्पादित नहीं हुआ तीसरा INSERT
कथन, जबकि pTMP2
proc किया। ऐसा इसलिए होता है क्योंकि जैसे ही त्रुटि होती है, नियंत्रण CATCH
पर कूद जाता है।
नोट: pTMP2
का व्यवहार XACT_ABORT
सेटिंग से प्रभावित होता है।
निष्कर्ष
प्रदर्शन के रूप में TRY..CATCH
उपयोग करने का लाभ कैसे आप अपने लेन-देन सीमाओं का प्रबंधन पर निर्भर करता है।
- यदि आप किसी भी त्रुटि पर रोल-बैक करते हैं, तो परिवर्तन पूर्ववत हो जाएंगे। लेकिन यह दुष्प्रभावों जैसे साइड इफेक्ट्स को खत्म नहीं करता है। नोट: यदि
WITH(NOLOCK)
का उपयोग करते हुए एक अलग सत्र TMP
से पूछताछ करता है तो यह अस्थायी परिवर्तन का भी निरीक्षण कर सकता है।
- हालांकि, यदि आप किसी लेन-देन को वापस रोल करने का इरादा नहीं रखते हैं, तो आप पाएंगे कि पहले त्रुटि के बावजूद कुछ डेटा परिवर्तन लागू होने से रोकने के लिए तकनीक काफी महत्वपूर्ण है।
स्रोत
2015-05-22 10:43:21
एकमात्र अंतर जो मैं सोच सकता हूं वह यह होगा कि लाइन नंबर की जानकारी और त्रुटि संख्या की जानकारी 'कैच' के बिना एक नया अपवाद फेंकने के बिना अधिक सटीक होगी, इसलिए यह वास्तव में मूल्य को घटाना प्रतीत होता है जहां तक मैं देख सकता हूं। .. –
मैं हमेशा एसक्यूएल जेनरेट त्रुटि संदेशों के बजाय फ्रंट एंड में एक कस्टम त्रुटि संदेश पसंद करना पसंद करता हूं। इस तरह से आपको तार्किक और साथ ही तकनीकी त्रुटि भी मिल जाएगी, जिसे आपने समझा और उल्लेख किया है। – Chris