जब त्रुटि होती है, लेन-देन स्वचालित रूप से वापस ले लिया जाता है, और वर्तमान बैच निरस्त कर दिया जाता है।
निष्पादन अगले बैच में जारी है, तथापि। तो त्रुटि के बाद बैचों में सभी चीजें निष्पादित हो जाती हैं। और फिर जब आप बाद में त्रुटियों की जांच करते हैं, तो आप पहले से लुढ़के हुए लेन-देन को रोलबैक करने का प्रयास करते हैं।
साथ ही, संपूर्ण स्क्रिप्ट को रोकने के लिए, न कि केवल वर्तमान बैच को, आपको इसका उपयोग करना चाहिए:
raiserror('Error description here', 20, -1) with log
देखें मेरा जवाब यहाँ उस पर विवरण के लिए।
तो आपको @error
. की जांच करने की आवश्यकता है प्रत्येक बैच के बाद, मुझे लगता है कि कुछ इस तरह काम करना चाहिए:
BEGIN TRANSACTION
GO
ALTER Stuff
GO
if @@error != 0 raiserror('Script failed', 20, -1) with log
GO
CREATE New Stuff
GO
if @@error != 0 raiserror('Script failed', 20, -1) with log
GO
DROP Old Stuff
GO
if @@error != 0 raiserror('Script failed', 20, -1) with log
GO
PRINT 'No Errors ... Committing changes'
COMMIT TRANSACTION