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
笔记:
- ?在查询中被替换为数据库名称,因此构造查询以显式定义要查询的数据库
- 修改为使用sys.all_sql_modules作为保存完整的模块文本(syscomments 可以在跨越行时拆分关键字)