【问题标题】:Running one single SQL query over many databases on one single server在一台服务器上对多个数据库运行一个 SQL 查询
【发布时间】:2018-03-21 14:15:37
【问题描述】:

我有一个查询要检查我的程序,如下:

DECLARE @SearchTerm VARCHAR(MAX) = 'INSERT' -- Just an example

SELECT ROUTINE_NAME [Procedure]
, SPECIFIC_CATALOG [Database]
FROM INFORMATION_SCHEMA.ROUTINES
WHERE SUBSTRING(ROUTINE_DEFINITION, 54, 20) LIKE '%'+@SearchTerm+'%'
AND ROUTINE_TYPE = 'PROCEDURE'
ORDER BY [Procedure]

示例输出:

Procedure     Database
pGetAnimals   Zoo
pGetGreens    Food
pGetBeans     Food
pGetChocolate Food

问题是,我的知识限制我为服务器上的每个数据库打开查询。

我想要的是在服务器上的所有数据库上运行查询,无论是;单个 select 语句,或将结果填充到临时表中。

我相信这是可能的。

有没有人知道一个巧妙的技巧来做到这一点?

【问题讨论】:

  • 你可以很容易地使用动态 sql 和 sys.databases。或者,您可以使用此处的过程循环遍历所有数据库。 sqlblog.org/2010/12/29/…

标签: sql-server database search stored-procedures


【解决方案1】:

请使用以下代码:

DECLARE @SearchTerm VARCHAR(MAX) = 'INSERT' -- Just an example

USE master

IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' AND TABLE_NAME='MyProcedures') DROP TABLE MyProcedures
CREATE TABLE MyProcedures([Procedure] VARCHAR(512) NULL,[Database] VARCHAR(64) NULL)

EXEC sp_MSforeachdb 'USE ?  

INSERT INTO master.dbo.MyProcedures
SELECT ROUTINE_NAME [Procedure]
, SPECIFIC_CATALOG [Database]
FROM INFORMATION_SCHEMA.ROUTINES
WHERE SUBSTRING(ROUTINE_DEFINITION, 54, 20) LIKE ''%' + @SearchTerm + '%''
AND ROUTINE_TYPE = ''PROCEDURE''
ORDER BY [Procedure]
';

SELECT * FROM MyProcedures

注意:主 SQL 在主数据库上填充表,并且是基于 VARCHAR 的。

【讨论】:

    猜你喜欢
    • 2016-02-24
    • 1970-01-01
    • 2016-03-07
    • 2014-01-03
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    相关资源
    最近更新 更多