it-swarm.dev

Jak wykonać SQL dla wszystkich baz danych na serwerze

Mam kilka standardowych skryptów SQL, które uruchamiam z wieloma bazami 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)

39
Andrew Bickerton

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ą (która zawiera kilka znanych błędów), możesz chcieć napisać własną wersja (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, dla której bazy danych ma wykonać zapytanie
  2. zmodyfikowany, aby używał sys.all_sql_modules jako zawierający pełny tekst modułu (syscomments mógł podziel słowo kluczowe po osiągnięciu zakresu ponad wierszami)
44
gbn

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

9
garik

Pakiet narzędzi SSMS robi to ładnie i jest bezpłatny dla serwerów baz danych przed 2012 rokiem. Funkcja: „Uruchom na wielu obiektach docelowych” - http://www.ssmstoolspack.com/Features?f=6

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 wydajny, ale przeoczony element funkcjonalności, gdy rutynowo musisz uruchamiać ten sam SQL na wielu serwerach.

2
Paul

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.

1
Endi Zhupani

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.

0
Juan Carlos