SQL Server 如何查询某存储过程是否存在于服务器任意数据库中
SQL Server全实例检索指定存储过程方案
你现有的单库查询代码可以调整为以下两种支持全库遍历的方案,两种都可以直接返回存储过程所属的数据库名称,无需手动逐个库查询:
方法1:使用内置遍历存储过程sp_MSforeachdb(快速实现)
这是SQL Server内置的未公开存储过程,可直接遍历所有数据库执行查询语句,适合临时查询场景:
-- 替换下方N'MyProcedure'为你要检索的存储过程实际名称 EXEC sp_MSforeachdb N' USE [?] IF EXISTS ( SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N''MyProcedure'') AND type = ''P'' -- 限定仅匹配存储过程类型的对象,避免误匹配 ) SELECT ''?'' AS 所属数据库名称, name AS 存储过程名称, object_id, create_date AS 创建时间, modify_date AS 最后修改时间 FROM sys.objects WHERE object_id = OBJECT_ID(N''MyProcedure'') AND type = ''P'' '
- 注意:
sp_MSforeachdb存在偶发遗漏数据库的问题,对查询完整性要求高的场景推荐使用第二种方案。
方法2:动态拼接查询语句(稳定无遗漏)
通过系统视图sys.databases获取所有在线数据库,手动拼接查询语句执行,不会出现库遗漏问题:
DECLARE @target_proc SYSNAME = N'MyProcedure' -- 替换为你要检索的存储过程名称 DECLARE @query_sql NVARCHAR(MAX) = N'' -- 拼接所有库的查询逻辑 SELECT @query_sql += N' UNION ALL SELECT N''' + name + ''' AS 所属数据库名称, name AS 存储过程名称, object_id, create_date AS 创建时间, modify_date AS 最后修改时间 FROM ' + QUOTENAME(name) + '.sys.objects WHERE object_id = OBJECT_ID(N''' + @target_proc + ''') AND type = ''P'' ' FROM sys.databases WHERE state = 0 -- 仅查询状态为在线的数据库,可根据需求调整过滤条件 -- 去除开头多余的UNION ALL关键字 SET @query_sql = STUFF(@query_sql, 1, 10, N'') -- 执行拼接后的查询语句 EXEC sp_executesql @query_sql
内容的提问来源于stack exchange,提问作者Razvan Ionescu
相关产品推荐
相关产品推荐

