web-dev-qa-db-ja.com

すべてのデータベースでストアドプロシージャのリストを検索するスクリプト

インスタンスで使用可能なストアドプロシージャのリストを取得する必要があります。次のT-SQLステートメントを使用して、特定のデータベースのストアドプロシージャを取得しました。

select * 
from MyDatabase.information_schema.routines 
where routine_type = 'Procedure'

すべてのストアドプロシージャを取得する、またはストアドプロシージャ名を使用してストアドプロシージャのデータベース名を確認するスクリプトはありますか?

7

次のものを使用できます。

CREATE TABLE #SPs (db_name varchar(100), name varchar(100), object_id int)

EXEC sp_msforeachdb 'USE [?]; INSERT INTO #SPs select ''?'', name, object_id from sys.procedures'

SELECT * FROM #SPs

上記のコードは、データベースごとにUSEを実行し、次にSELECT from sys.proceduresを実行して、データを一時テーブルにロードします。 sys.proceduresはデータベース内のすべてのストアドプロシージャを一覧表示し、sp_msforeachdbは各データベースでコードを実行します(コード内のデータベース名に?を使用します)。コードが実行されると、一時テーブルをクエリして統合リストを取得できます。

sp_msforeachdbには問題があることがわかっているため、Aaron Bertrandの改良版 here を使用することをお勧めします。

6
Kenneth Fisher

そのためには、すべてのデータベースを反復処理する必要があります。十分に冒険したい場合は、文書化されていないストアドプロシージャsp_MSForEachDBを使用できます。これは、 バギーで信頼性が低い です。

別の可能性は、その代替の1つを使用することです: Aaron Bertrand's または 私の控えめな試み

さらに別の可能性は、カーソルを使用してすべてのデータベースをループすることです。

USE master;

DECLARE @name sysname;
DECLARE @sql nvarchar(max) = '
    SELECT 
        DB_NAME() AS [database_name],
        OBJECT_SCHEMA_NAME(object_id) AS [schema_name],
        name AS [procedure_name]
    FROM sys.procedures
';
DECLARE @theSQL nvarchar(max);

DECLARE @results TABLE (
    [database_name] sysname,
    [schema_name] sysname,
    [procedure_name] sysname
);

DECLARE dbs CURSOR STATIC LOCAL FORWARD_ONLY READ_ONLY 
FOR
SELECT name 
FROM sys.databases;
-- you may want to exclude system databases here
-- WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb', 'distribution')

OPEN dbs;
FETCH NEXT FROM dbs INTO @name;

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @theSQL = 'EXEC ' + QUOTENAME(@name) + '.sys.sp_executesql @sql';

    INSERT @results
    EXEC sys.sp_executesql @theSQL, N'@sql nvarchar(max)', @sql

    FETCH NEXT FROM dbs INTO @name; 
END

CLOSE dbs;
DEALLOCATE dbs;

SELECT *
FROM @results;
6
spaghettidba

このスクリプトはすべてのデータベースを検索して、特定のストアドプロシージャが存在するすべての場所を見つけますが、パラメーターを省略すると、すべてのストアドプロシージャの完全なリストが表示されます。

--=====================================================================================
-- looking at all databases to find a stored procedure named @spName
-- marcelo miorelli
-- 1-april-2014
--=====================================================================================
DECLARE @SQL NVARCHAR(max)
    ,@spName VARCHAR(100) = 'usp_sel_CAEval4_comments' -- THE PROCEDURE THAT I AM LOOKING FOR

SELECT @SQL = STUFF((
            SELECT CHAR(10) + ' UNION ALL '           + CHAR(10) +  
' SELECT ' + quotename(NAME, '''') + ' AS DB_NAME '   + CHAR(10) + 
'         , SCHEMA_NAME(s.schema_id)  AS THE_SCHEMA ' + CHAR(10) + 
'         , s.name  COLLATE Latin1_General_CI_AS AS THE_NAME  ' + CHAR(10) + 
'  FROM ' + quotename(NAME) + '.sys.procedures s '    + CHAR(10) +   
' WHERE s.name = @spName 
  AND s.[type] = ''P'''
            FROM sys.databases
            ORDER BY NAME
            FOR XML PATH('')
                ,TYPE
            ).value('.', 'nvarchar(max)'), 1, 11, '')

--PRINT @SQL

EXECUTE sp_executeSQL @SQL
    ,N'@spName varchar(100)'
    ,@spName
0