Хранимая процедура sp_databases
перечисляет все базы данных на сервере.Выполнение:
CREATE TABLE #d (
DATABASE_NAME VARCHAR(255),
DATABASE_SIZE INT, REMARKS NVARCHAR(MAX)
)
INSERT INTO #d EXEC sp_databases
Даст вам таблицу, содержащую все имена баз данных.
Далее таблица [DATABASE NAME].sys.procedures
содержит список всех хранимых процедур в базе данных.
Таким образом, вам нужно будет открыть курсор, в котором перечислены все базы данных на сервере, а затем использовать динамический SQL для поиска сохраненного процесса по имени в каждой базе данных.Надеюсь, вы можете заполнить детали:)
OK;Я заполнил для вас детали
IF OBJECT_ID('[FindStoredProcOnServer]') IS NOT NULL
DROP PROCEDURE [FindStoredProcOnServer]
GO
CREATE PROCEDURE [FindStoredProcOnServer]
@storedProcName VARCHAR(255),
@databaseName VARCHAR(255) OUTPUT,
@debug BIT = 0
AS
BEGIN
DECLARE @err BIT
DECLARE @sql NVARCHAR(MAX)
DECLARE @params NVARCHAR(MAX)
DECLARE @exists BIT
CREATE TABLE #output (DATABASE_NAME VARCHAR(255))
CREATE TABLE #d (
DATABASE_NAME VARCHAR(255),
DATABASE_SIZE INT,
REMARKS NVARCHAR(MAX)
)
INSERT INTO #d EXEC sp_databases
DECLARE dbCursor CURSOR FOR SELECT DATABASE_NAME FROM #d
OPEN dbCursor
SET @params = '@exists BIT OUTPUT'
FETCH NEXT FROM dbCursor INTO @databaseName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = '
SELECT
@exists = COUNT(*)
FROM
[' + @databaseName + '].sys.procedures
WHERE
Name = ''' + @storedProcName + ''''
IF @debug = 1 PRINT @sql
EXEC sp_executesql
@sql = @sql,
@params = @params,
@exists = @exists OUTPUT
SET @err = @@ERROR
IF ISNULL(@err, 0) != 0 GOTO ERROR_HANDLER
IF @exists = 1 INSERT INTO #output VALUES (@databaseName)
FETCH NEXT FROM dbCursor INTO @databaseName
END
ERROR_HANDLER:
CLOSE dbCursor
DEALLOCATE dbCursor
IF ISNULL(@err, 0) != 0
RAISERROR('--- Ending [FindStoredProcOnServer]: Failed', 16, 1)
ELSE
SELECT * FROM #output
RETURN ISNULL(@err, 0)
END