Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

गतिशील एसक्यूएल त्रुटि:'ट्रिगर बनाएं' एक क्वेरी बैच में पहला बयान होना चाहिए

यदि आप इस . द्वारा निर्मित कोड को चलाने के लिए 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() समारोह , जैसा कि उपरोक्त कथन में है)।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एंटिटी फ्रेमवर्क से एकल रिकॉर्ड हटाएं?

  2. चुनिंदा क्वेरी में ऑटो इंक्रीमेंट फ़ील्ड कैसे जनरेट करें?

  3. FIFO द्वारा क्लोजिंग स्टॉक मात्रा, मूल्य और मूल्य की गणना करें

  4. मैं SQL सर्वर में संग्रहीत कार्यविधि से पैरामीटर की सूची कैसे प्राप्त कर सकता हूं?

  5. आवधिक अमान्यकास्ट अपवाद और सर्वर लिंक के साथ लेनदेन को फिर से शुरू करने में विफल रहा