서버의 모든 DB에 대해 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 유용한 대안을뿐만 아니라.
Nomad

답변:


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. ? 쿼리에서 데이터베이스 이름으로 바뀌므로 쿼리 할 DB를 명시 적으로 정의하도록 쿼리를 구성하십시오.
  2. 완전한 모듈 텍스트를 보유한 상태로 sys.all_sql_modules를 사용하도록 수정되었습니다 (syscomments 행에 걸쳐있을 때 키워드를 분할 할 수 있음)

sp_MSforeachdb는 때때로 비정상적 일 수 있으므로 Pradeep의 답변에 제공된 링크를보십시오.
Eric Humphrey-lotsahelp

sp_MSForEachDB는 빠른 쿼리에 적합합니다. 각 결과의 데이터베이스를 표시 할 수있는 방법이 있습니까?
Diskdrive

@Diskdrive : , ''?'' AS DBNameselect 문에 추가 하십시오. 내 예에 따라
gbn

9

내 $ 0.05 : SQL Multi Script (여러 SQL Server에 대한 여러 스크립트 실행)


1
상용 솔루션을지지하는 이와 같은 답변은 금지되어야합니다!
Fandango68

2
@ Fandango68 나는 그 회사에서 일하고 있지 않습니다. 방금 도구를 사용했습니다. 이해의 상충이 없습니다. 당신은 어떻습니까? ).
garik

4
@ Fandango68 나는 오히려 그렇지 않았다. 최상의 솔루션은 항상 고려되어야하며 최상의 무료 솔루션은 그에 대한 무게를가집니다.
Paul


2

단일 세미 병합 결과 집합으로 출력을 제공하는 추가 방법이 있습니다. 먼저 등록 된 서버를 열고 로컬 서버 그룹 아래에 새 그룹을 만든 다음 각 DB에 대해 서버를 한 번 등록하십시오. 각 경우마다 기본 DB를 원하는 것으로 설정하십시오.

완료되면 그룹을 마우스 오른쪽 버튼으로 클릭하고 새 쿼리를 선택하십시오. 열리는 쿼리 창에는 일반적으로 상태 표시 줄에 서버 이름이 표시되는 "다중"이 있습니다. 이 창에서 실행되는 모든 쿼리는 그룹에 있던 등록 된 각 서버에서 작동합니다. 결과의 첫 번째 열은 등록 된 서버의 이름입니다. 결과 집합은 첫 번째 열에 의해 조각화되고 의지에 의한 순서는 해당 조각 내에서만 작동합니다.

일상적으로 여러 서버에서 동일한 SQL을 실행해야 할 때 매우 강력하지만 간과 된 기능입니다.


나는 이것을 많이 사용하며 SSMS의 훌륭한 기능입니다. 단점은 수동으로 만 사용하기 때문에 정기적으로 실행되도록 자동화하려는 경우 유용하지 않습니다.
Swears-a-lot 선생님

1

우리 회사는 xSQL Script Executor 도구를 개발했습니다 . 개인적으로 무료로 사용할 수 있으며 여러 대상에 스크립트를 매우 쉽게 배포 할 수 있습니다.


이것은 훌륭한 프로그램입니다! 사용하기 쉽고 직관적입니다.
Sean Perkins

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.