在所有数据库中查找存储过程列表的脚本

Vin*_*vel 7 sql-server stored-procedures t-sql

我需要提取在我的实例中可用的存储过程列表。我使用以下 T-SQL 语句来获取给定数据库中的存储过程。

select * 
from MyDatabase.information_schema.routines 
where routine_type = 'Procedure'
Run Code Online (Sandbox Code Playgroud)

有没有脚本可以获取所有的存储过程或者通过存储过程名称来检查存储过程的数据库名称?

spa*_*dba 6

您必须遍历所有数据库才能做到这一点。如果您足够冒险,您可以使用未记录的存储过程 sp_MSForEachDB,它有缺陷且不可靠

另一种可能性是使用它的替代品之一:Aaron Bertrand's我谦虚的尝试

另一种可能性是使用游标循环遍历所有数据库:

USE master;

DECLARE @name sysname;
DECLARE @sql nvarchar(max) = '
    SELECT 
        DB_NAME() AS [database_name],
        OBJECT_SCHEMA_NAME(object_id) AS [schema_name],
        name AS [procedure_name]
    FROM sys.procedures
';
DECLARE @theSQL nvarchar(max);

DECLARE @results TABLE (
    [database_name] sysname,
    [schema_name] sysname,
    [procedure_name] sysname
);

DECLARE dbs CURSOR STATIC LOCAL FORWARD_ONLY READ_ONLY 
FOR
SELECT name 
FROM sys.databases;
-- you may want to exclude system databases here
-- WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb', 'distribution')

OPEN dbs;
FETCH NEXT FROM dbs INTO @name;

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @theSQL = 'EXEC ' + QUOTENAME(@name) + '.sys.sp_executesql @sql';

    INSERT @results
    EXEC sys.sp_executesql @theSQL, N'@sql nvarchar(max)', @sql

    FETCH NEXT FROM dbs INTO @name; 
END

CLOSE dbs;
DEALLOCATE dbs;

SELECT *
FROM @results;
Run Code Online (Sandbox Code Playgroud)


Ken*_*her 6

您可以使用以下内容:

CREATE TABLE #SPs (db_name varchar(100), name varchar(100), object_id int)

EXEC sp_msforeachdb 'USE [?]; INSERT INTO #SPs select ''?'', name, object_id from sys.procedures'

SELECT * FROM #SPs
Run Code Online (Sandbox Code Playgroud)

上面的代码为每个数据库运行 aUSE然后 a SELECT from sys.procedures,将数据加载到临时表中。 sys.procedures列出数据库中的所有存储过程,并将sp_msforeachdb在每个数据库上运行代码(在代码中使用 ? 作为数据库名称)。代码运行后,您可以查询临时表以获取合并列表。

sp_msforeachdb已知存在问题,因此您可能需要使用位于此处的Aaron Bertrand 改进版本。