GO एक T-SQL कमांड नहीं है। एक बैच सीमांकक है। क्लाइंट टूल (SSM, sqlcmd, osql आदि) इसका उपयोग प्रभावी ढंग से कट करने के लिए करता है प्रत्येक GO पर फ़ाइल और सर्वर को अलग-अलग बैच भेजें। तो स्पष्ट रूप से आप IF के अंदर GO का उपयोग नहीं कर सकते हैं, और न ही आप यह उम्मीद कर सकते हैं कि वेरिएबल बैचों के दायरे में फैले हों।
साथ ही, आप XACT_STATE()<की जांच किए बिना अपवादों को नहीं पकड़ सकते। /कोड>
यह सुनिश्चित करने के लिए कि लेन-देन बर्बाद नहीं हुआ है।
आईडी के लिए GUID का उपयोग करना हमेशा कम से कम संदेहास्पद होता है।
NOT NULL बाधाओं का उपयोग करना और एक डिफ़ॉल्ट 'गाइड' प्रदान करना जैसे '{00000000-0000-0000-0000-000000000000}'
भी सही नहीं हो सकता।
अपडेट किया गया:
- ALTER और UPDATE को दो बैचों में अलग करें।
- त्रुटि पर स्क्रिप्ट को तोड़ने के लिए sqlcmd एक्सटेंशन का उपयोग करें। यह SSMS द्वारा समर्थित है जब sqlcmd मोड चालू होता है , sqlcmd, और क्लाइंट लाइब्रेरी में भी इसका समर्थन करने के लिए तुच्छ है:dbutilsqlcmd ।
- उपयोग
XACT_ABORT
बैच को बाधित करने के लिए त्रुटि को बाध्य करने के लिए। यह अक्सर रखरखाव स्क्रिप्ट (स्कीमा परिवर्तन) में उपयोग किया जाता है। संग्रहीत कार्यविधियाँ और अनुप्रयोग तर्क स्क्रिप्ट सामान्य रूप से इसके बजाय TRY-CATCH ब्लॉक का उपयोग करते हैं, लेकिन उचित देखभाल के साथ:अपवाद प्रबंधन और नेस्टेड लेनदेन ।
उदाहरण स्क्रिप्ट:
:on error exit
set xact_abort on;
go
begin transaction;
go
if columnproperty(object_id('Code'), 'ColorId', 'AllowsNull') is null
begin
alter table Code add ColorId uniqueidentifier null;
end
go
update Code
set ColorId = '...'
where ...
go
commit;
go
केवल एक सफल स्क्रिप्ट ही COMMIT
तक पहुंच पाएगी . कोई भी त्रुटि स्क्रिप्ट और रोलबैक को निरस्त कर देगी।
मैंने COLUMNPROPERTY
का इस्तेमाल किया
कॉलम अस्तित्व की जांच करने के लिए, आप इसके बजाय अपनी पसंद की किसी भी विधि का उपयोग कर सकते हैं (उदाहरण के लिए लुकअप sys.columns
)।