2011-10-19 101 views
0

我错过了一个名为Select_Customer的存储过程。我有很多版本的相同的数据库,我不能真正记得程序的位置。我如何搜索多个数据库来查找对象?在多个数据库中搜索

回答

1

存储过程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在每个数据库中按名称查找存储过程。希望你能填写详细内容:)

好的;我已经填写了你的详细信息

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