Поиск в нескольких базах данных - PullRequest
0 голосов
/ 19 октября 2011

Я пропустил одну хранимую процедуру с именем Select_Customer. У меня много версий одной базы данных, я не могу вспомнить, где процедура. Как я могу искать в нескольких базах данных, чтобы найти объект?

1 Ответ

1 голос
/ 19 октября 2011

Хранимая процедура 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...