如何在哪个数据库中找到名为“myStoredProcedure”的存储过程?

时间:2011-12-22 15:04:11

标签: sql tsql stored-procedures sysobjects

我连接的SQL服务器有很多数据库。

如何查询sysobjects以便在哪个数据库中找到名为“myStoredProcedure”的存储过程?

查询应返回数据库名称。

由于

3 个答案:

答案 0 :(得分:3)

我知道你不是要求这个,但我真的为SSMS下载RedGate's Sql Search加载项并使用它。它允许您轻松地在任何数据库上查找任何对象(proc,表,视图,列等)。

它是免费的!

答案 1 :(得分:0)

我试试看:

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,则应该这样做。如果你想在其他地方使用输出作为参数,可能需要更多的工作。

顺便说一下,我在过去的几个月里只是自己学习这些东西,所以如果有人能批评上述内容并提出更好的方法,我很乐意收到反馈。同样,我可以尽我所能回答此处发布的任何其他问题。

干杯

答案 2 :(得分:0)

出于好奇,我决定尝试自己编写,特别是因为ADG提到他的解决方案是使用不受支持的无证程序。这也可以扩展为第二个参数,所以它检查type = P(存储过程)你可能会改变它以寻找其他东西,如视图/表等。

我的解决方案有点长,但这里有:

  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