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?
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 .
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;
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