sp_MSForEachDB
Bir seçenek sp_MSForEachDB'dir . Belgelenmemiş ancak yine de yararlı
DECLARE @command varchar(1000)
SELECT @command =
'USE [?] UPDATE Table1 SET Field1 = ''ninjas'' WHERE Field2 = ''pirates'''
EXEC sp_MSforeachdb @command
İnterweb'lerin araştırılmasında çok daha fazla örnek var
Not: Desteklenmeyen bir işlev olarak (bilinen bazı hataları vardır) kendi sürümünüzü yazmak isteyebilirsiniz (thanks @Pradeep)
Yukarıdaki SQL örneğinin aşağıdaki gibi yeniden yapılandırılması gerekir:
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
NOTLAR:
- ? Sorguda veritabanı adı olarak değiştirildiğinden, sorgunun hangi DB'ye karşı sorgulanacağını açıkça tanımlayacak şekilde yapılandırın.
- Kullanım sys.all_sql_modules modifiye komple modül metni (syscomments tutar gibi olabilir anahtar kelimeyi bölmek zaman satırların üzerine yayılan ulaşmak)