インスタンスで使用可能なストアドプロシージャのリストを取得する必要があります。次のT-SQLステートメントを使用して、特定のデータベースのストアドプロシージャを取得しました。
select *
from MyDatabase.information_schema.routines
where routine_type = 'Procedure'
すべてのストアドプロシージャを取得する、またはストアドプロシージャ名を使用してストアドプロシージャのデータベース名を確認するスクリプトはありますか?
次のものを使用できます。
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 を使用することをお勧めします。
そのためには、すべてのデータベースを反復処理する必要があります。十分に冒険したい場合は、文書化されていないストアドプロシージャ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;
このスクリプトはすべてのデータベースを検索して、特定のストアドプロシージャが存在するすべての場所を見つけますが、パラメーターを省略すると、すべてのストアドプロシージャの完全なリストが表示されます。
--=====================================================================================
-- 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