Stored-Procedures

通過 SQL Server 2000 實例中所有數據庫的名稱描述引用儲存過程

  • April 24, 2017

在 SQL Server 2000 實例中的所有數據庫中,是否有人有有效的方法來引用系統資訊來搜尋儲存過程?我目前的任務是將水晶報表遷移到 SSRS,客戶大約有 500 個或更多水晶報表,其中儲存過程分佈在多個數據庫中。我知道我可以按文本過濾每個數據庫的可程式性文件夾,但我正在尋找一個結果,我可以在其中查詢 master.dbo.sysdatabases 並將其引用到 syscomments 中,我可以在其中指定文本並找到與數據庫相關的儲存過程。

只需使用游標遍歷數據庫並查詢 sysobjects 表:

Select * from sysobjects 
where type='P' 
and name='StoredProcName'

(不包括游標程式碼。)或使用(未記錄)sp_MSforeachdb

EXEC sp_MSforeachdb 'USE ? SELECT ''?'' as dbname, name FROM sysobjects 
     WHERE type = ''P'' AND name = ''StoredProcName''

(不過,不要把它分成兩行)

此外,sp_MSforeachdb 存在已知問題,例如在很長的數據庫名稱上失敗,所以我通常更喜歡游標。

如果有人好奇游標程式碼的外觀,請參閱此 MSDN 文章

DECLARE @SearchString VARCHAR(255)
DECLARE @name VARCHAR(50)
DECLARE @db_name1 VARCHAR(50)
DECLARE @db_name2 VARCHAR(50)
DECLARE @sql VARCHAR(100)
SET @SearchString = 'a_ras_Arlenes_ship_sched_sp'

DECLARE db_cursor CURSOR FOR 

SELECT name
FROM MASTER.dbo.sysdatabases
WHERE name NOT IN ('master','model','msdb','tempdb') 

OPEN db_cursor 

FETCH NEXT FROM db_cursor WITH (NOLOCK) INTO @name  

While @@FETCH_STATUS = 0
BEGIN
 SET @db_name1 =@name+'.dbo.syscomments'
 SET @db_name2 =@name+'.dbo.sysobjects'    

 SELECT @sql = 'SELECT DISTINCT b.name FROM ' + @db_name1 
             + ' a JOIN ' + @db_name2 + ' b ON a.id = b.id'
             +' WHERE a.text like %' + @SearchString + '% ORDER BY b.name'

 EXEC(@sql)

 FETCH NEXT FROM db_cursor WITH (NOLOCK) INTO @name

END 
Close db_cursor
DEALLOCATE db_cursor

引用自:https://dba.stackexchange.com/questions/171663