Как определить, в какой базе данных находится хранимая процедура с именем «myStoredProcedure»? - PullRequest
2 голосов
/ 22 декабря 2011

Есть куча баз данных к серверу SQL, к которому я подключен.

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

Запрос должен вернуть имя базы данных.

Спасибо

Ответы [ 3 ]

3 голосов
/ 22 декабря 2011

Я знаю, что вы не просите об этом, но я действительно скачал бы Sql Search надстройка RedGate для SSMS и использовал бы ее. Это позволяет легко найти любой объект (proc, table, view, column и т. Д.) В любой базе данных.

И это бесплатно!

0 голосов
/ 22 декабря 2011

Поэтому из любопытства я решил попробовать написать это сам, тем более, что 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
0 голосов
/ 22 декабря 2011

Я бы попробовал:

CREATE TABLE ##DatabaseList
                (
                DatabaseName varchar(50)
                ) 

 EXECUTE SP_MSForEachDB 'USE [?]; INSERT INTO ##DatabaseList SELECT DB_NAME() FROM [sys].[objects] WHERE name = "MyStoredProcedure" AND type_desc = "SQL_STORED_PROCEDURE"'

 SELECT * FROM ##DatabaseList

 DROP TABLE ##DatabaseList

Это использует недокументированную / неподдерживаемую системную хранимую процедуру SP_MSForEachDb и записывает любые попадания в глобальную временную таблицу, а затем выводит содержимое в окно результатов перед удалением таблицы. Если вам просто нужно знать, какая база данных (или базы данных - их может быть несколько) имеет подходящее имя SP, это следует сделать. Если вы хотите использовать вывод в другом месте в качестве параметра, это может занять немного больше работы.

Кстати, я сам изучаю этот материал только за последние несколько месяцев, так что если кто-то может критиковать вышесказанное и предлагать лучший способ сделать это, я рад получить обратную связь. Точно так же я могу ответить на любые дополнительные вопросы, размещенные здесь, в меру своих возможностей.

Приветствия

...