我在单个服务器上针对多个数据库运行一些标准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


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

评论

您可能会发现msforeachdb的这种替代方法也很有用。

#1 楼

sp_MSForEachDB

一个选项是sp_MSForEachDB。它没有文档,但仍然有用已知的错误),您可能需要编写自己的版本(感谢@Pradeep)


上面的SQL示例将需要重组为: />
提示:


?在查询中被替换为
数据库名称,因此构造
查询以显式定义要查询的数据库
修改为使用sys.all_sql_modules作为完整模块文本(当达到跨行范围时,系统注释可能会拆分关键字)


评论


sp_MSforeachdb有时可能会有些不稳定,因此请查看Pradeep答案中提供的链接。

–埃里克·汉弗莱-lotahelp
2011-2-18在4:37

sp_MSForEachDB对于快速查询似乎很好。有没有一种方法可以显示每个结果来自哪个数据库?

–Diskdrive
16-09-19的1:37

@Diskdrive:在任何选择语句中添加AS DBName,“?” AS DBName。按照我的例子

– gbn
16-09-20在6:59



#2 楼

仅$ 0.05:SQL Multi Script(针对多个SQL Server执行多个脚本)。

评论


这样的答案,赞成商业解决方案,应该被禁止!

– Fandango68
17年8月2日在23:14

@ Fandango68我不在那家公司工作。我刚刚使用过这样的工具。没有利益冲突,那你呢? )。

– Garik
17年8月3日在8:48

@ Fandango68我希望他们不是。应该始终考虑最好的解决方案,而最好的免费解决方案对它们不利。

– Paul
17年11月6日14:41

#3 楼

SSMS Tools Pack可以很好地做到这一点,并且它对于2012年之前的数据库服务器是免费的。
功能:“在多个目标上运行”-http://www.ssmstoolspack.com/Features?f=6

#4 楼

还有一种方法可以在单个半合并结果集中提供输出。首先打开“注册服务器”并在“本地服务器组”下创建一个新组,然后为每个数据库注册一次服务器,在每种情况下,将默认数据库设置为所需的数据库。

完成后,右键单击您的组,然后选择“新建查询”。打开的查询窗口将带有“多个”,您通常会在状态栏上看到服务器名称。在此窗口中运行的所有查询都将在组中的每个已注册服务器上运行。结果的第一列将是注册服务器的名称。结果集将由该第一列分段,而order by意志将仅在该分段内运行。

功能非常强大,但却被忽略了,因为您通常需要在多个服务器上运行相同的SQL。

评论


我经常使用它,这在SSMS中是一个很棒的功能。缺点是它仅用于手动使用,因此如果要自动执行某些常规操作,则没有用。

–先生Swears-a-lot
18 Jun 21'在2:55



#5 楼

我公司开发了一个名为xSQL Script Executor的工具。它是免费供个人使用,对我而言,它使在多个目标上部署脚本非常容易。

评论


这是一个很棒的程序!易于使用和直观。

– Sean Perkins
17年7月28日在19:59

#6 楼

我开发了这个工具:https://github.com/andreujuanc/TakoDeploy

我仍然在上面写一些代码,但是到现在为止还很稳定。
我已经将它用于生产数据库,并且像一个饰物一样工作。