Как выполнить 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, поскольку содержит полный текст модуля (syscomments может разбить ключевое слово при достижении охвата строк)

sp_MSforeachdb иногда может быть некорректным, поэтому посмотрите на ссылку, приведенную в ответе Прадипа.
Эрик Хамфри - Lotshelp

Sp_MSForEachDB кажется хорошим для быстрого запроса. Есть ли способ, чтобы я мог показать, из какой базы данных получены все результаты?
дисковод

@Diskdrive: добавить , ''?'' AS DBNameв любой оператор выбора. Согласно моему примеру
gbn

9

Просто мои $ 0,05: SQL Multi Script (выполнение нескольких сценариев на нескольких серверах SQL).


1
Подобные ответы, одобряющие коммерческое решение, должны быть запрещены ТАК!
Fandango68

2
@ Fandango68 Я не работаю в этой компании. Я только что использовал такой инструмент. Нет конфликта интересов, а вы? ).
Гарик

4
@ Fandango68 Я бы предпочел, чтобы они не были. Лучшие решения всегда должны быть рассмотрены, а лучшие бесплатные решения сопоставлены с ними.
Пол


2

Существует еще один метод, который будет выдавать результаты в одном полуслитом наборе результатов. Сначала откройте Зарегистрированные серверы и создайте новую группу в разделе Группы локальных серверов, затем зарегистрируйте свой сервер один раз для каждой БД, в каждом случае устанавливая БД по умолчанию на желаемую.

После завершения щелкните правой кнопкой мыши на вашей группе и выберите Новый запрос. В открывшемся окне запроса будет «несколько», где вы обычно видите имя сервера в строке состояния. Любые запросы, запущенные в этом окне, будут работать на каждом зарегистрированном сервере, который был в группе. Первым столбцом результатов будет имя зарегистрированного сервера. Результирующий набор будет фрагментирован по первому столбцу, а порядок по воле будет действовать только внутри этого фрагмента.

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


Я часто этим пользуюсь, и это отличная возможность в SSMS. Недостатком является то, что он предназначен только для ручного использования, поэтому бесполезен, если вы хотите автоматизировать что-то для регулярного запуска.
Сэр, клянется много

1

Моя компания разработала инструмент под названием xSQL Script Executor . Это бесплатно для личного использования, и для меня, это сделало развертывание сценариев для нескольких целей очень простым.


Это отличная программа! Простой в использовании и интуитивно понятный.
Шон Перкинс

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.