Поэтому из любопытства я решил попробовать написать это сам, тем более, что ADG упомянул, что его решение использует неподдерживаемую недокументированную процедуру. Это также можно расширить, чтобы получить 2-й параметр, чтобы при проверке типа = P (сохраненный Proc) вы могли изменить его, чтобы искать другие вещи, такие как представления / таблицы и т. Д.
Мое решение немного длинное, но здесь идет речь:
CREATE PROCEDURE spFindProceduresInDatabases
(
@ProcedureName NVARCHAR(99)
)
AS
BEGIN
-- Get all the database names and put them into a table
DECLARE @Db TABLE (DatabaseName Varchar(99))
INSERT INTO @Db SELECT name FROM Sys.databases
-- Declare a table to hold our results
DECLARE @results TABLE (DatabaseName VARCHAR(99))
-- Make a Loop
-- Declare a variable to be incremented
DECLARE @count INT
SET @count = 0
-- Declare the end condition
DECLARE @endCount INT
SELECT @endCount = COUNT(*) FROM @Db
-- Loop through the databases
WHILE (@count < @endCount )
BEGIN
-- Get the database we are going to look into
DECLARE @dbWeAreChecking VARCHAR(99)
SELECT TOP 1 @dbWeAreChecking = DatabaseName FROM @Db
DELETE FROM @Db WHERE DatabaseName = @dbWeAreChecking
-- Create and execute our query
DECLARE @Query NVARCHAR(3000)
SET @Query = N'SELECT @outParam = COUNT(*) FROM '+@dbWeAreChecking+'.sys.sysobjects WHERE type = ''P'' and name = @ProcedureName'
Declare @outParam INT
print (@Query)
DECLARE @ParmDefinition NVARCHAR(500)
DECLARE @IntVariable INT
SET @ParmDefinition = N'@ProcedureName VARCHAR(99),@outParam INT OUTPUT'
SET @IntVariable = 35
EXECUTE sp_executesql
@Query ,
@ParmDefinition,
@ProcedureName,
@outParam = @outParam OUTPUT
-- If we have a result insert it into the results table
If (@outParam > 0)
BEGIN
INSERT INTO @results(DatabaseName) VALUES(@dbWeAreChecking)
END
-- Increment the counter
SET @count = (@count + 1)
END
-- SELECT ALL OF THE THINGS!!!
SELECT * FROM @results
END