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