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
如何在单个服务器上针对所有数据库执行此操作? (除了手动连接到一个并执行之外)
#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我仍然在上面写一些代码,但是到现在为止还很稳定。
我已经将它用于生产数据库,并且像一个饰物一样工作。
评论
您可能会发现msforeachdb的这种替代方法也很有用。