我最近加入了一个拥有大约 20-40 个数据库的软件项目。
每个数据库至少有200个存储过程,有些甚至更多,所以我手动搜索特定过程非常慢。
我知道有一个存储过程,我需要查看它来修复错误,在整个项目中的某处,它被称为
XYZ_procedure
如何在 SQL Server Management Studio 中的所有数据库中搜索此过程?
如果您需要按名称查找数据库对象(例如表、列、触发器) - 请查看称为 SQL Search 的免费 Red-Gate 工具,它可以执行此操作 - 它会在整个数据库中搜索任何类型的字符串(s).
对于任何 DBA 或数据库开发人员来说,它都是一个很棒的必备工具 - 我是否已经提到过它绝对免费可用于任何类型的用途?
您可以在SQL Server Management Studio中使用动态SQL检查所有数据库的过程
USE MASTER
GO
BEGIN TRAN
DECLARE @strt INT,@End INT,@Database NVARCHAR(50)
SELECT * INTO #T FROM Sys.databases WITH(NOLOCK) WHERE database_id>4
ORDER BY 1
SELECT ROW_NUMBER ()OVER (ORDER BY database_Id)Db_Id,* INTO #TT FROM #T
SET @strt=1
SELECT @End=Max(Db_ID)FROM #tt
WHILE @strt<=@END
BEGIN
DECLARE @string NVARCHAR(MAX)
SELECT @Database=NAME FROM #TT WHERE Db_ID=@strt
Set @string=' Select '''+@Database+'''db_Name,* from '+@Database+'.sys.objects
WHERE Name=''XYZ_procedure'''
SET @strt=@strt+1
PRINT @string
EXEC(@string)
END
ROLLBACK TRAN
我认为最简单的方法是使用未记录的存储过程
sp_MSForeachdb
,它为每个数据库执行一个命令:
EXEC sp_MSforeachdb
'
USE ?
IF EXISTS (
SELECT 1
FROM sys.objects
WHERE name = ''XYZ_procedure''
)
SELECT DB_NAME();
'
我发现了类似问题的查询。答案建议使用以下 SQL 查询,
SELECT [name] AS DatabaseName
FROM sys.databases
WHERE OBJECT_ID(QUOTENAME(name) + '.dbo.ProcedureNameHere', 'P') IS NOT NULL