Як виконати SQL проти всіх БД на сервері


38

У мене є стандартний SQL, з яким я працюю проти декількох баз даних на одному сервері, щоб допомогти мені діагностувати проблеми:

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

У пошуках переплетень є ще багато прикладів

Примітка. Будучи непідтримуваною функцією (яка має деякі відомі помилки), ви можете написати свою власну версію (спасибі @Pradeep)


Наведений вище приклад 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. ? замінюється в запиті як ім'я бази даних, тому структуруйте запит, щоб чітко визначити, до якої БД потрібно звертатись
  2. модифіковано для використання sys.all_sql_modules як вмістує повний текст модуля (систематики можуть розділити ключове слово, досягнувши розтягування на рядки)

sp_MSforeachdb іноді може бути невловимим, тому подивіться на посилання, що надається у відповіді Прадіпа.
Ерік Хамфрі - лоташельп

Sp_MSForEachDB здається хорошим для швидкого запиту. Чи є спосіб я змусити його показати, з якої бази даних отримані всі результати?
Diskdrive

@Diskdrive: додайте , ''?'' AS DBNameдо будь-якого оператора вибору. Як на мій приклад
gbn

9

Лише мій 0,05 долара: Мульти сценарій SQL (виконання декількох скриптів проти декількох серверів SQL).


1
Такі відповіді, підтримуючи комерційне рішення, слід забороняти ТАК!
Fandango68

2
@ Fandango68 Я не працюю в цій компанії. Я щойно використовував такий інструмент. Немає конфлікту інтересів, що з вами? ).
garik

4
@ Fandango68 Я б швидше їх не робив. Завжди слід враховувати найкращі рішення, а найкращі безкоштовні рішення зважувати на них.
Павло


2

Існує подальший метод, який дасть вихід у єдиному наборі результатів напівз’єднаного результату. Спочатку відкрийте Зареєстровані сервери та створіть нову групу в локальних групах серверів, а потім зареєструйте ваш сервер один раз для кожної БД, у кожному випадку встановивши БД за замовчуванням на потрібний.

Після повного клацання правою кнопкою миші на вашій групі та виберіть Новий запит. У вікні запиту, що відкриється, буде "кілька", де ви зазвичай бачите ім'я сервера на панелі стану. Будь-які запити, запущені у цьому вікні, працюватимуть на кожному зареєстрованому сервері, який був у групі. Першим стовпцем результатів буде ім’я зареєстрованого сервера. Набір результатів буде фрагментований першим стовпцем, а порядок за заповітом працює лише в межах цього фрагмента.

Дуже потужний, але занедбаний фрагмент функціональності, коли вам доведеться запускати один і той же SQL на декількох серверах.


Я цим багато користуюся, і це чудова особливість у SSMS. Мінус полягає в тому, що він призначений лише для ручного використання, тому не корисний, якщо ви хочете автоматизувати щось для регулярного запуску.
Сер клянеться багато

1

Моя компанія розробила інструмент, який називається xSQL Script Executor . Він безкоштовний для особистого використання, і для мене він дуже легко спробив розгортання сценаріїв на декілька цілей.


Це чудова програма! Простий у використанні та інтуїтивно зрозумілий.
Шон Перкінс

0

Я розробив цей інструмент: https://github.com/andreujuanc/TakoDeploy

Я все ще пишу деякі рядки на ньому, але це досить стабільно на сьогоднішній день. Я використовував це проти виробничих баз даних і працює як шарм.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.