यदि आप इस . द्वारा निर्मित कोड को चलाने के लिए SSMS (या अन्य समान टूल) का उपयोग करते हैं स्क्रिप्ट, आपको बिल्कुल वही त्रुटि मिलेगी। जब आप बैच सीमांकक सम्मिलित करते हैं तो यह ठीक चल सकता है (GO
), लेकिन अब जब आप ऐसा नहीं करते हैं, तो आपको SSMS में भी यही समस्या का सामना करना पड़ेगा।
दूसरी ओर, जिस कारण से आप GO
नहीं डाल सकते हैं आपकी डायनामिक स्क्रिप्ट में इसलिए है क्योंकि GO
SQL कथन नहीं है, यह केवल SSMS और कुछ अन्य उपकरणों द्वारा मान्यता प्राप्त एक सीमांकक है। शायद आप पहले से ही इसके बारे में जानते हैं।
वैसे भी, GO
. की बात यह जानने के लिए उपकरण के लिए है कि कोड को विभाजित किया जाना चाहिए और इसके हिस्से अलग से चलते हैं . और वह, अलग से , वही है जो आपको अपने कोड में भी करना चाहिए।
तो, आपके पास ये विकल्प हैं:
-
सम्मिलित करें
EXEC sp_execute @sql
ट्रिगर को छोड़ने वाले हिस्से के ठीक बाद,@sql
. का मान रीसेट करें फिर परिभाषा भाग को उसकी बारी में संग्रहीत और चलाने के लिए; -
दो चरों का उपयोग करें,
@sql1
और@sql2
, IF EXISTS/DROP भाग को@sql1
. में संग्रहित करें , एक ट्रिगर बनाएं@sql2
. में , फिर दोनों स्क्रिप्ट चलाएँ (फिर से, अलग से)।
लेकिन फिर, जैसा कि आप पहले ही पता लगा चुके हैं, आपको एक और समस्या का सामना करना पड़ेगा:आप उस डेटाबेस के संदर्भ में कथन चलाए बिना किसी अन्य डेटाबेस में ट्रिगर नहीं बना सकते हैं ।
अब, आवश्यक संदर्भ प्रदान करने के 2 तरीके हैं:
1) एक USE
का उपयोग करें बयान;
2) EXEC targetdatabase..sp_executesql N'…'
।
जाहिर है, पहला विकल्प यहां काम नहीं करेगा:हम USE …
. नहीं जोड़ सकते हैं CREATE TRIGGER
. से पहले , क्योंकि बाद वाला बैच में एकमात्र स्टेटमेंट होना चाहिए।
दूसरा विकल्प कर सकते हैं उपयोग किया जा सकता है, लेकिन इसके लिए गतिशीलता . की एक अतिरिक्त परत की आवश्यकता होगी (सुनिश्चित नहीं है कि यह एक शब्द है)। ऐसा इसलिए है क्योंकि डेटाबेस नाम यहां एक पैरामीटर है और इसलिए हमें EXEC targetdatabase..sp_executesql N'…'
के रूप में एक गतिशील स्क्रिप्ट, और चूंकि चलने वाली वास्तविक स्क्रिप्ट को स्वयं एक गतिशील स्क्रिप्ट माना जाता है, इसलिए, इसे दो बार नेस्ट किया जाएगा।
तो, (दूसरा) EXEC sp_executesql @sql;
. से पहले पंक्ति निम्नलिखित जोड़ें:
SET @sql = N'EXEC ' + @dbname + '..sp_executesql N'''
+ REPLACE(@sql, '''', '''''') + '''';
जैसा कि आप देख सकते हैं, @sql
. की सामग्री को एकीकृत करने के लिए एक नेस्टेड डायनामिक स्क्रिप्ट के रूप में ठीक से, उन्हें सिंगल कोट्स में संलग्न किया जाना चाहिए। इसी कारण से, हर एक उद्धरण चिह्न में . है @sql
दोगुना होना चाहिए (उदाहरण के लिए का उपयोग करना REPLACE()
समारोह
, जैसा कि उपरोक्त कथन में है)।