AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 907
Accepted
Andrew Bickerton
Andrew Bickerton
Asked: 2011-01-27 05:03:46 +0800 CST2011-01-27 05:03:46 +0800 CST 2011-01-27 05:03:46 +0800 CST

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

  • 772

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

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

sql-server
  • 6 6 个回答
  • 66764 Views

6 个回答

  • Voted
  1. Best Answer
    gbn
    2011-01-27T05:10:36+08:002011-01-27T05:10:36+08:00

    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
    

    笔记:

    1. ? 在查询中被替换为数据库名称,因此构造查询以明确定义要查询的数据库
    2. 修改为使用 sys.all_sql_modules 作为保存完整的模块文本(syscomments可以在到达跨行时拆分关键字)
    • 45
  2. garik
    2011-01-28T23:00:57+08:002011-01-28T23:00:57+08:00

    只是我的 0.05 美元:SQL 多脚本(针对多个 SQL Server 执行多个脚本)。

    • 9
  3. EnocNRoll - AnandaGopal Pardue
    2013-07-30T08:49:03+08:002013-07-30T08:49:03+08:00

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

    • 3
  4. Paul
    2017-11-07T06:40:01+08:002017-11-07T06:40:01+08:00

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

    完成后,右键单击您的组并选择新查询。打开的查询窗口将有“多个”,您通常会在状态栏上看到服务器名称。在此窗口中运行的任何查询都将在该组中的每个已注册服务器上运行。结果的第一列将是注册服务器的名称。结果集将按第一列进行分段,并且按遗嘱排序仅在该分段内操作。

    当您经常需要在多台服务器上运行相同的 SQL 时,这是非常强大但被忽视的功能。

    • 2
  5. Endi Zhupani
    2016-07-20T05:42:38+08:002016-07-20T05:42:38+08:00

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

    • 1
  6. Juan Carlos
    2016-10-12T16:45:07+08:002016-10-12T16:45:07+08:00

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

    我还在上面写了几行,但它现在相当稳定。我已经将它用于生产数据库并且工作起来就像一个魅力。

    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve