web-dev-qa-db-fra.com

Script pour trouver la liste des procédures stockées dans toutes les bases de données

J'ai besoin de retirer la liste des procédures stockées disponibles dans mon instance. J'ai utilisé l'instruction T-SQL suivante pour obtenir les procédures stockées dans une base de données donnée.

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

Existe-t-il un script pour obtenir toutes les procédures stockées ou pour vérifier le nom de base de données de la procédure stockée en utilisant le nom de la procédure stockée?

7
Vinesh Senthilvel

Vous pouvez utiliser les éléments suivants:

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

Le code ci-dessus exécute un USE puis un SELECT from sys.procedures pour chaque base de données, chargement des données dans une table temporaire. sys.procedures répertorie toutes les procédures stockées dans la base de données et sp_msforeachdb exécutera le code sur chaque base de données (utilisez un? pour le nom de la base de données dans le code). Une fois le code exécuté, vous pouvez interroger la table temporaire pour obtenir la liste consolidée.

sp_msforeachdb est connu pour avoir des problèmes, vous pouvez donc utiliser la version améliorée d'Aaron Bertrand située ici .

6
Kenneth Fisher

Pour ce faire, vous devez parcourir toutes les bases de données. Si vous êtes assez aventureux, vous pouvez utiliser la procédure stockée non documentée sp_MSForEachDB, qui est boguée et peu fiable .

Une autre possibilité est d'utiliser l'un de ses remplaçants: Aaron Bertrand ou mon humble tentative .

Encore une autre possibilité consiste à utiliser un curseur pour parcourir toutes les bases de données:

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

ce script recherche toutes les bases de données pour trouver chaque endroit où réside une procédure stockée spécifique, mais si vous omettez le paramètre, vous obtiendrez une liste complète de toutes les procédures stockées.

--=====================================================================================
-- 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
Marcello Miorelli