कैसे सर्वर पर सभी DBs के खिलाफ SQL निष्पादित करने के लिए


38

मेरे पास कुछ मानक एसक्यूएल हैं जो मुझे समस्याओं का निदान करने में मदद करने के लिए एक सर्वर पर कई डेटाबेस के खिलाफ चलते हैं:

select 
    so.name,
    so.type,
    MAX(case when sc.text like '%remote%' then '' ELSE 'N' END) AS Relevant,
    @@ServerName as Server,
    DB_Name() as DBName 
from
    sysobjects so with (nolock)
    join syscomments sc with (nolock) on so.id = sc.id
where (sc.text like '%emote%')
group by so.name, so.type
order by so.type, so.name

मैं एक ही सर्वर पर सभी डेटाबेस के खिलाफ इसे कैसे निष्पादित कर सकता हूं? (एक समय में मैन्युअल रूप से कनेक्ट करने और निष्पादित करने के अलावा)


आपको ms_foreachdb का यह विकल्प उपयोगी हो सकता है ।
घुमंतू

जवाबों:


44

sp_MSForEachDB

एक विकल्प sp_MSForEachDB है । यह अनिर्दिष्ट है लेकिन फिर भी उपयोगी नहीं है

DECLARE @command varchar(1000) 
SELECT @command = 
    'USE [?] UPDATE Table1 SET Field1 = ''ninjas'' WHERE Field2 = ''pirates''' 
EXEC sp_MSforeachdb @command

इंटरव्यू की एक खोज के कई और उदाहरण भी हैं

नोट: एक असमर्थित फ़ंक्शन (जिसमें कुछ ज्ञात बग हैं) होने के नाते आप अपना स्वयं का संस्करण लिखना चाहते हैं (धन्यवाद @ प्रदीप)


ऊपर दिए गए SQL उदाहरण का पुनर्गठन इस प्रकार करना होगा:

DECLARE @findKeySQL nvarchar(2000)
DECLARE @searchKey nvarchar(20)

SET @searchKey = lower('%remote%')

SET @findKeySQL = 'IF ''[?]'' NOT IN (''[master]'', ''[model]'', 
                                     ''[msdb]'', ''[tempdb]'')
        select 
            so.name,
            so.type,
            @@ServerName as Server,
            ''?'' as DBName 
        from
            [?].dbo.sysobjects so with (nolock)
            join [?].sys.all_sql_modules sc with (nolock) on so.id = sc.object_id
        where (lower(sc.definition) like ''' + @searchKey + ''')
        group by so.name, so.type
        order by so.type, so.name'

EXEC sp_MSForEachDB @findKeySQL

टिप्पणियाँ:

  1. ? डेटाबेस नाम के रूप में क्वेरी में प्रतिस्थापित किया जाता है, इसलिए क्वेरी को स्पष्ट रूप से परिभाषित करने के लिए कि किस DB के विरुद्ध क्वेरी करना है, संरचना करें
  2. पूर्ण मॉड्यूल पाठ रखने के लिए sys.all_sql_modules का उपयोग करने के लिए संशोधित ( पंक्तियों पर फैले तक पहुँचने पर syscomments कीवर्ड को विभाजित कर सकता है )

sp_MSforeachdb कभी-कभी परतदार हो सकता है, इसलिए प्रदीप के उत्तर में दिए गए लिंक को देखें।
एरिक हम्फ्रे - लॉटहेल्प

एक त्वरित क्वेरी के लिए sp_MSForEachDB अच्छा लगता है। क्या कोई तरीका है जिससे मैं यह दिखा सकूँ कि प्रत्येक परिणाम किस डेटाबेस से आया है?
डिस्कड्राइव

@Diskdrive: , ''?'' AS DBNameकिसी भी चुनिंदा विवरण में जोड़ें । मेरे उदाहरण के अनुसार
gbn

9

बस मेरा $ 0.05: SQL मल्टी स्क्रिप्ट (कई SQL सर्वर के खिलाफ कई स्क्रिप्ट का निष्पादन)।


1
इस तरह के जवाब, एक व्यावसायिक समाधान का समर्थन करते हुए, एसओ पर प्रतिबंध लगाया जाना चाहिए!
Fandango68

2
@ Fandango68 मैं उस कंपनी के लिए काम नहीं कर रहा हूं। मैंने सिर्फ इतना टूल इस्तेमाल किया है। हितों का टकराव नहीं, आपका क्या? )।
गरिक

4
@ Fandango68 मैं बल्कि वे नहीं थे। सबसे अच्छा समाधान हमेशा माना जाना चाहिए, और सबसे अच्छा मुफ्त समाधान उनके खिलाफ तौला।
पॉल


2

एक और विधि है जो एकल सेमी-मर्ज किए गए परिणाम सेट में आउटपुट देगी। पहले पंजीकृत सर्वर खोलें और स्थानीय सर्वर समूहों के तहत एक नया समूह बनाएं फिर प्रत्येक डीबी के लिए एक बार अपना सर्वर पंजीकृत करें, प्रत्येक मामले में डिफ़ॉल्ट डीबी को एक वांछित में सेट करें।

एक बार पूर्ण रूप से अपने समूह पर राइट क्लिक करें और न्यू क्वेरी का चयन करें। खुलने वाली क्वेरी विंडो में "मल्टीपल" होगा जहां आप सामान्य रूप से स्टेटस बार पर सर्वर का नाम देखेंगे। इस विंडो में चलने वाला कोई भी प्रश्न समूह में प्रत्येक पंजीकृत सर्वर पर काम करेगा। परिणामों का पहला कॉलम पंजीकृत सर्वर का नाम होगा। परिणाम सेट को उस पहले कॉलम द्वारा खंडित किया जाएगा और वसीयत द्वारा आदेश केवल उस टुकड़े के भीतर ही काम करेंगे।

जब आप नियमित रूप से कई सर्वरों पर एक ही एसक्यूएल को चलाने के लिए बहुत शक्तिशाली लेकिन कार्यक्षमता के अनदेखे टुकड़े को अनदेखा करते हैं।


मैं इसे बहुत उपयोग करता हूं और यह SSMS में एक बड़ी विशेषता है। नकारात्मक पक्ष यह है कि यह केवल मैनुअल उपयोग के लिए है, इसलिए यदि आप नियमित रूप से चलाने के लिए कुछ स्वचालित करना चाहते हैं तो उपयोगी नहीं है।
सर स्वियर्स-ए-लॉट

1

मेरी कंपनी ने एक उपकरण विकसित किया है जिसे एक्सक्यूएल स्क्रिप्ट एक्जिक्यूटर कहा जाता है । यह व्यक्तिगत उपयोग के लिए स्वतंत्र है, और मेरे लिए, इसने कई लक्ष्यों पर स्क्रिप्ट को तैनात करना बहुत आसान बना दिया है।


यह एक बड़ा कार्यक्रम है! प्रयोग करने में आसान और सहज।
शॉन पर्किंस

0

मैंने इस टूल को विकसित किया: https://github.com/andreujuanc/TakoDeploy

Im अभी भी उस पर कुछ पंक्तियाँ लिख रहा है, लेकिन अब तक इसकी बहुत स्थिर है। मैंने इसका उपयोग उत्पादन डेटाबेस के खिलाफ किया है और एक आकर्षण की तरह काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.