ठीक sp_msforeachdb पर्दे के पीछे कैसे काम करता है?


9

मुझे जो समस्या हो रही है, उसका निवारण करने की आवश्यकता है, और मुझे यह समझने में कुछ मदद चाहिए कि sp_msforeachdb मेरी समस्या को दूर करने के लिए कैसे काम करता है।

क्या होता है हर बार जब मैं sp_msforeachdb चलाता हूं, मुझे एक त्रुटि मिलती है Msg 102, Level 15, State 1, Incorrect syntax near '61'

मेरे कोड का एक उदाहरण इस प्रकार है:

EXEC SP_msforeachdb 'SELECT ''?'' AS Database
                     FROM ?.sys.objects
                     WHERE name like ''%aetna%''

हालाँकि, इससे कोई फर्क नहीं पड़ता कि sp_msforeachdb के पैरामीटर के रूप में मेरे पास कौन सी क्वेरी है। हर बार मुझे वही त्रुटि मिलती है। मेरे पास एक डेटाबेस है जो '61s1d' से शुरू होता है, जिससे मुझे लगता है कि यह DB नाम के साथ एक मुद्दा है, लेकिन मैं ईमानदारी से नहीं जानता कि sp_msforeachdb पर पर्दे के पीछे क्या चल रहा है।

ध्यान देने योग्य बातें।

  • यह एकमात्र डेटाबेस है जो एक संख्या से शुरू होता है
  • मैं कोड का उपयोग करने की कोशिश कर सकता हूं जैसे "अगर डेटाबेस '% 61% जैसा है तो ...... नहीं", लेकिन फिर भी वही त्रुटि है।
  • मैं डेटाबेस के नाम को बदलने का परीक्षण नहीं कर सकता - इससे जुड़ी बहुत सी चीजें।
  • यदि मैं एक परीक्षण db बनाता हूं जो '51' से शुरू होता है, तो मुझे उस डेटाबेस के लिए भी त्रुटि मिलती है

मैं इससे कैसे उबरूं?

जवाबों:


16

सबसे पहले sp_msforeachdb का उपयोग न करें, इसके कई ज्ञात मुद्दे हैं। आप यहाँ और यहाँ हारून बर्ट्रेंड के संस्करण का उपयोग करके बेहतर हैं

हालाँकि यह एक कर्सर, डायनेमिक SQL और एक प्रतिस्थापन का उपयोग करता है। आप वास्तव में sp_helptext का उपयोग करके कोड को देख सकते हैं।

EXEC sp_helptext sp_msforeachdb

यदि आप इस कोड का उपयोग करते हैं तो यह आपके कुछ मुद्दों को ठीक कर देगा।

EXEC SP_msforeachdb 'SELECT ''?'' AS Database
                 FROM [?].sys.objects
                 WHERE name like ''%aetna%''

कोष्ठक आपके द्वारा बताई गई विशिष्ट समस्या होगी। हालाँकि, यदि आपके पास इसमें [या] डेटाबेस है, तो आप मुद्दों पर चलेंगे।


दिलचस्प है, "चारों ओर" कोष्ठक का उपयोग करना? से काम किया। मैं हारून बर्ट्रेंड के संस्करण में देखूंगा। क्या आपने कर्सर की वजह से प्रदर्शन में महत्वपूर्ण गिरावट देखी है?
जेफ. क्लार्क

2
जब आप कुछ पंक्तियों से अधिक हैं, तो कर्सर केवल एक वास्तविक प्रदर्शन समस्या है। जब तक आप डेटाबेस के अधिकतम # पास नहीं हो जाते, तब तक आपको कोई समस्या नहीं दिखाई देती। समस्या यह है कि यह डेटाबेस को छोड़ सकता है। हारून का लेख पढ़ें और वह और अधिक विस्तार में चला गया।
केनेथ फिशर

1
मैंने देखा है कि यह DBs को पूरी तरह से एक से अधिक अवसरों पर छोड़ देता है। हारून का उपयोग करें, यह बहुत अधिक विश्वसनीय है।
क्रिश ग्रुतेमेयेर

11

@Kenneth ने कहा कि किसी भी चीज से असहमत नहीं, मुझे कहना चाहिए कि जिस त्रुटि का आप सामना कर रहे हैं उसका कोई लेना-देना नहीं है sp_MSForEachDB। यह इस कारण से है कि डेटाबेस का नाम कैसे पड़ा: यह एक संख्या से शुरू होता है। डेटाबेस पहचानकर्ताओं के लिए MSDN पृष्ठ में ऑब्जेक्ट्स (केवल डेटाबेस नहीं) के नामकरण के नियम विस्तृत हैं । यदि आप "नियमित पहचानकर्ताओं के लिए नियम" का पालन करते हैं, तो आपको उन नामों को वर्ग कोष्ठक या दोहरे कोट्स में संलग्न करने की आवश्यकता नहीं है । लेकिन ऐसे नाम हैं जो उन नियमों में शामिल नहीं हैं करते संलग्न किया जाना है (हमेशा) की जरूरत है।


1
इस जानकारी के लिए भी धन्यवाद - मैं उस प्रतिबंध से अनभिज्ञ था। दुर्भाग्य से उस डेटाबेस को एक दशक पहले बनाया गया था जब मैं कंपनी में शामिल हो गया :)
Jeff.Clark

@ Jeff.Clark मैं आपको सुझाव नहीं दे रहा था कि आप डीबी का नाम बदलें जैसा कि आपने इस प्रश्न में उल्लेख किया है कि आप इसे बदल नहीं सकते हैं। मैं आपको (और अन्य) वास्तविक मुद्दे को जानना चाहता था क्योंकि यह फिर से कभी भी आएगा, आपको उस डेटाबेस का नाम कहीं भी निर्दिष्ट करने की आवश्यकता है। और नियमों के उस पूर्ण सेट के माध्यम से पढ़ने से आपको उन अन्य चीजों से बचने में मदद मिल सकती है जिनके लिए एक नाम की आवश्यकता होगी - डेटाबेस, टेबल, स्तंभ, सूचकांक, बाधा, आदि - हमेशा वर्ग-कोष्ठक या डबल-कोट्स में संलग्न होने के लिए।
सोलोमन रटज़की
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.