Jak wykonać SQL dla wszystkich baz danych na serwerze

38

Mam kilka standardowych instrukcji SQL, które uruchamiam na wielu bazach danych na jednym serwerze, aby pomóc mi zdiagnozować problemy:

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

Jak mogę to zrobić dla wszystkich baz danych na jednym serwerze? (oprócz ręcznego łączenia się z jednym na raz i wykonywania)

Andrew Bickerton
źródło
Można znaleźć alternatywę ms_foreachdb przydatny również.
Nomad

Odpowiedzi:

44

sp_MSForEachDB

Jedną z opcji jest sp_MSForEachDB . Jest to nieudokumentowane, ale mimo to przydatne

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

Wyszukiwanie interwebs zawiera również wiele innych przykładów

Uwaga: Będąc nieobsługiwaną funkcją (zawierającą znane błędy) możesz napisać własną wersję (dzięki @Pradeep)


Powyższy przykład SQL musiałby zostać zrestrukturyzowany jako:

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

UWAGI:

  1. ? jest zastępowane w zapytaniu jako nazwa bazy danych, więc ułóż zapytanie w taki sposób, aby wyraźnie określało, do której bazy danych ma wysłać zapytanie
  2. zmodyfikowany, aby używał sys.all_sql_modules jako przechowuje pełny tekst modułu (syscomments może podzielić słowo kluczowe po osiągnięciu zakresu ponad wierszami)
gbn
źródło
sp_MSforeachdb może czasem być niestabilny, więc spójrz na link podany w odpowiedzi Pradeepa.
Eric Humphrey - lotsahelp
Sp_MSForEachDB wydaje się dobry do szybkiego zapytania. Czy istnieje sposób, aby pokazać, z której bazy danych pochodzą poszczególne wyniki?
Diskdrive,
@Diskdrive: dodaj , ''?'' AS DBNamedo dowolnej instrukcji select. Jak na moim przykładzie
gbn
9

Tylko moje 0,05 $: SQL Multi Script (wykonywanie wielu skryptów na wielu serwerach SQL).

garik
źródło
1
Takie odpowiedzi, popierające komercyjne rozwiązanie, powinny zostać zakazane TAK!
Fandango68,
2
@ Fandango68 Nie pracuję dla tej firmy. Właśnie użyłem tego narzędzia. Brak konfliktu interesów, a Ty? ).
garik
4
@ Fandango68 Wolałbym, żeby nie były. Zawsze należy brać pod uwagę najlepsze rozwiązania, a najlepsze bezpłatne rozwiązania będą się z nimi porównywać.
Paul,
2

Istnieje kolejna metoda, która da wynik w jednym częściowo połączonym zestawie wyników. Najpierw otwórz Zarejestrowane serwery i utwórz nową grupę w Lokalnych grupach serwerów, a następnie zarejestruj swój serwer raz dla każdej bazy danych, w każdym przypadku ustawiając domyślną bazę danych na żądaną.

Po zakończeniu kliknij prawym przyciskiem myszy swoją grupę i wybierz Nowe zapytanie. Okno zapytania, które zostanie otwarte, będzie miało „wiele”, w których normalnie zobaczysz nazwę serwera na pasku stanu. Wszelkie zapytania uruchomione w tym oknie będą działać na każdym zarejestrowanym serwerze, który był w grupie. Pierwsza kolumna wyników będzie nazwą zarejestrowanego serwera. Zestaw wyników zostanie pofragmentowany według tej pierwszej kolumny, a kolejność według woli będzie działać tylko w obrębie tego fragmentu.

Bardzo potężny, ale przeoczony element funkcjonalności, gdy rutynowo musisz uruchamiać ten sam SQL na wielu serwerach.

Paweł
źródło
Często tego używam i jest to świetna funkcja w SSMS. Minusem jest to, że jest to tylko do użytku ręcznego, więc nie jest użyteczne, jeśli chcesz zautomatyzować coś, aby regularnie działać.
Sir Swears-a-lot
1

Moja firma opracowała narzędzie o nazwie xSQL Script Executor . Jest bezpłatny do użytku osobistego, a dla mnie bardzo ułatwia wdrażanie skryptów na wielu obiektach docelowych.

Endi Zhupani
źródło
To świetny program! Łatwy w użyciu i intuicyjny.
Sean Perkins
0

Opracowałem to narzędzie: https://github.com/andreujuanc/TakoDeploy

Nadal piszę na nim kilka wierszy, ale do tej pory jest dość stabilny. Użyłem go przeciwko produkcyjnym bazom danych i działa jak urok.

Juan Carlos
źródło