sql-server – 如何对服务器上的所有数据库执行SQL

我有一些标准的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

如何针对单个服务器上的所有数据库执行此操作? (除了一次手动连接一个并执行)

解决方法

sp_MSForEachDB

一个选项是sp_MSForEachDB.它没有文档但仍然有用

DECLARE @command varchar(1000) 
SELECT @command = 
    'USE [?] UPDATE Table1 SET Field1 = ''ninjas'' WHERE Field2 = ''pirates''' 
EXEC sp_MSforeachdb @command

对互联网的搜索也有更多的例子

注意:作为一个不受支持功能(有一些已知的错误)你可能想写自己的version(感谢@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,''?'' 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可以在到达跨越行时分割关键字)

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...