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)
有没有脚本可以获取所有的存储过程或者通过存储过程名称来检查存储过程的数据库名称?
您必须遍历所有数据库才能做到这一点。如果您足够冒险,您可以使用未记录的存储过程 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)
您可以使用以下内容:
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 改进版本。
归档时间: |
|
查看次数: |
46159 次 |
最近记录: |