Requête pour répertorier toutes les procédures stockées


338

Quelle requête peut renvoyer les noms de toutes les procédures stockées dans une base de données SQL Server

Si la requête pouvait exclure des procédures stockées système, ce serait encore plus utile.

Réponses:


499

Comme Mike l'a déclaré, la meilleure façon est de l'utiliser information_schema. Tant que vous n'êtes pas dans la base de données master, les procédures stockées système ne seront pas retournées.

SELECT * 
  FROM DatabaseName.INFORMATION_SCHEMA.ROUTINES
 WHERE ROUTINE_TYPE = 'PROCEDURE'

Si, pour une raison quelconque, vous aviez des procédures stockées non système dans la base de données master, vous pouvez utiliser la requête (cela filtrera la plupart des procédures stockées système):

SELECT * 
  FROM [master].INFORMATION_SCHEMA.ROUTINES
 WHERE ROUTINE_TYPE = 'PROCEDURE' 
   AND LEFT(ROUTINE_NAME, 3) NOT IN ('sp_', 'xp_', 'ms_')

3
Si vous créez des diagrammes de base de données, vous pourriez obtenir un tas de procs commençant par 'dt_' dans votre base de données que vous pouvez également filtrer.
John Fouhy

+1 pour le schéma d'information. vaut la peine d'être lu: msdn.microsoft.com/en-us/library/ms186778.aspx
Shiham

Cela devrait être "Tant que vous n'êtes pas dans les bases de données [master] ou [msdb], ..."
Solomon Rutzky

107
SELECT name, 
       type
  FROM dbo.sysobjects
 WHERE (type = 'P')

4
Cela a fonctionné pour moi dans un environnement partagé dans MS-SQL 2008; les deux précédents n'ont pas ...
Realto619

3
Toute personne utilisant SQL Server 2005 ou une version plus récente doit s'éloigner des dbo.sys*vues. Cette requête: filtre également les procédures stockées CLR, ne filtre pas les proc stockés par le système et renvoie [type] quand il est connu que [type] sera toujours 'P' car c'est la condition WHERE.
Solomon Rutzky

cela ne fonctionnera pas si les objets de la base de données ont un schéma différent
Foyzul Karim

30

D'après ma compréhension, la méthode "préférée" consiste à utiliser les tables information_schema:

select * 
  from information_schema.routines 
 where routine_type = 'PROCEDURE'

les enregistrements retournés ne semblent pas avoir un moyen de différencier les procédures stockées du système

18

Les éléments suivants renvoient toutes les procédures dans la base de données sélectionnée

SELECT * FROM sys.procedures

cela a été modifié et crée une date, etc. ce qui est très utile
ihightower

14

Vous pouvez essayer cette requête pour obtenir des procédures et des fonctions stockées:

SELECT name, type
FROM dbo.sysobjects
WHERE type IN (
    'P', -- stored procedures
    'FN', -- scalar functions 
    'IF', -- inline table-valued functions
    'TF' -- table-valued functions
)
ORDER BY type, name

10

Si vous utilisez SQL Server 2005, les éléments suivants fonctionneront:

select *
  from sys.procedures
 where is_ms_shipped = 0

cela donnera le mauvais résultat et inclura un système comme une procédure stockée de diagramme (sp_upgraddiagrams) dans sql 2008
HaveNoDisplayName

@Piyush Vrai qu'il renverra les procs du diagramme, mais quelqu'un pourrait ne pas les considérer comme des procs "système" car ils ne sont pas fournis avec l'installation standard. L'OP n'a pas précisé comment gérer cela, donc ne pas les filtrer n'est pas nécessairement faux.
Solomon Rutzky

@srutzky: - mais ce ne sont toujours pas des sp créés par l'utilisateur
HaveNoDisplayName

@Piyush Vrai, mais comme je l'ai dit, l'OP n'a pas précisé comment gérer les procs qui ne sont ni "créés par l'utilisateur" ni "système". Et personne n'a demandé.
Solomon Rutzky

Très bonne réponse. Merci d'avoir inclus "is_ms_shipped = 0."
Hans Vonn

8

Vous pouvez utiliser l'une des requêtes ci-dessous pour trouver la liste des procédures stockées dans une base de données:

Requête1:

    SELECT 
        *
    FROM sys.procedures;

Requête2:

    SELECT 
        * 
    FROM information_schema.routines 
    WHERE ROUTINE_TYPE = 'PROCEDURE' 

Si vous souhaitez trouver la liste de tous les SP dans toutes les bases de données, vous pouvez utiliser la requête ci-dessous:

    CREATE TABLE #ListOfSPs 
    (
        DBName varchar(100), 
        [OBJECT_ID] INT,
        SPName varchar(100)
    )

    EXEC sp_msforeachdb 'USE [?]; INSERT INTO #ListOfSPs Select ''?'', Object_Id, Name FROM sys.procedures'

    SELECT 
        * 
    FROM #ListOfSPs

1
IMO votre exemple en utilisant le sp_msforeachdb est or et devrait être la réponse. Voici un lien que j'ai trouvé en parlant plus de ce sproc: weblogs.sqlteam.com/joew/archive/2008/08/27/60700.aspx
Mike Cheel

8

Sélectionner toutes les procédures et vues stockées

select name,type,type_desc
from sys.objects
where type in ('V','P')
order by name,type

5

Cela peut également aider à répertorier la procédure à l'exception des procédures système:

select * from sys.all_objects where type='p' and is_ms_shipped=0

Il n'y a aucune raison de l'utiliser sys.all_objectspuisque vous filtrez is_ms_shipped=0. Il peut contenir des déclencheurs DDL, mais ceux-ci seront filtrés par type='p'. Vous pourriez aussi bien utiliser sys.objects.
Solomon Rutzky

4

Malheureusement, INFORMATION_SCHEMAne contient pas d'informations sur les procs du système.

SELECT *
  FROM sys.objects
 WHERE objectproperty(object_id, N'IsMSShipped') = 0
   AND objectproperty(object_id, N'IsProcedure') = 1

1
Pourquoi voudriez-vous utiliser cela à la place sys.procedures where is_ms_shipped = 0? Et pourquoi exécuter une fonction objectproperty(object_id, N'IsMSShipped')pour chaque ligne alors qu'il y a un champ is_ms_shippedqui contient cette valeur? Dans le même ordre d'idées, pourquoi exécuter à nouveau cette fonction quand [type] IN ('P', 'PC')fait la même chose? Cette méthode est inutilement compliquée et inefficace.
Solomon Rutzky

4

Juste les noms:

SELECT SPECIFIC_NAME  
FROM YOUR_DB_NAME.information_schema.routines  
WHERE routine_type = 'PROCEDURE'

3

J'ai modifié l'excellent article de LostCajun ci-dessus pour exclure les procédures stockées du système. J'ai également supprimé "Extraire". du code parce que je ne pouvais pas comprendre à quoi il sert et cela m'a donné des erreurs. L'instruction "fetch next" à l'intérieur de la boucle avait également besoin d'une clause "into".

use <<databasename>>
go

declare @aQuery nvarchar(1024);
declare @spName nvarchar(64);
declare allSP cursor for
    select p.name  
    from sys.procedures p 
    where p.type_desc = 'SQL_STORED_PROCEDURE' 
    and LEFT(p.name,3) NOT IN ('sp_','xp_','ms_')
    order by p.name;
open allSP;
fetch next from allSP into @spName;
while (@@FETCH_STATUS = 0)
begin
    set @aQuery = 'sp_helptext [' + @spName + ']';
    exec sp_executesql @aQuery;
    fetch next from allSP into @spName;
end;
close allSP;
deallocate allSP;

2

la meilleure façon d'obtenir des objets est d'utiliser sys.sql_modules. vous pouvez trouver tout ce que vous voulez dans cette table et joindre cette table à une autre table pour obtenir plus d'informations par object_id

SELECT o. object_id,o.name AS name,o.type_desc,m.definition,schemas.name scheamaName
FROM sys.sql_modules        m 
    INNER JOIN sys.objects  o ON m.object_id=o.OBJECT_ID
    INNER JOIN sys.schemas ON schemas.schema_id = o.schema_id
    WHERE [TYPE]='p'

1
select *  
  from dbo.sysobjects
 where xtype = 'P'
   and status > 0

l'état> 0 ne semble pas faire la différence entre les procédures stockées du système et celles créées

Hmm. C'est le cas pour nous - je ne sais pas pourquoi.
Bob Probst

Toute personne utilisant SQL Server 2005 ou une version plus récente doit s'éloigner des dbo.sys*vues. Cette requête filtre également les procédures stockées CLR.
Solomon Rutzky

1

J'ai écrit ce simple tsql pour lister le texte de toutes les procédures stockées. Assurez-vous de remplacer le nom de votre base de données dans le champ.

use << database name >>
go

declare @aQuery nvarchar(1024);
declare @spName nvarchar(64);
declare allSP cursor for
select p.name  from sys.procedures p where p.type_desc = 'SQL_STORED_PROCEDURE' order by p.name;
open allSP;
fetch next from allSP into @spName;
while (@@FETCH_STATUS = 0)
begin
    set @aQuery = 'sp_helptext [Extract.' + @spName + ']';
    exec sp_executesql @aQuery;
    fetch next from allSP;
end;
close allSP;
deallocate allSP;

s'il vous plaît voir la réécriture de @BaffledBill de cela .. qui a fonctionné pour moi. Celui-ci n'a pas fonctionné car il y avait beaucoup d'erreurs.
ihightower

1

Cela ne donnera que les noms des procédures stockées.

select specific_name
from information_schema.routines
where routine_type = 'PROCEDURE';

1

Cela va montrer toutes les procédures stockées et le code:

select sch.name As [Schema], obj.name AS [Stored Procedure], code.definition AS [Code] from sys.objects as obj
    join sys.sql_modules as code on code.object_id = obj.object_id
    join sys.schemas as sch on sch.schema_id = obj.schema_id
    where obj.type = 'P'

0

Ceci, listez tout ce que vous voulez

Dans Sql Server 2005, 2008, 2012:

Use [YourDataBase]

EXEC sp_tables @table_type = "'PROCEDURE'" 
EXEC sp_tables @table_type = "'TABLE'"
EXEC sp_tables @table_type = "'VIEW'" 

OU

SELECT * FROM information_schema.tables
SELECT * FROM information_schema.VIEWS

Il n'y a aucune raison d'utiliser ou de bénéficier de l'utilisation de sp_tables. En outre, "PROCEDURE" n'est pas une option valide pour sp_tables. Les seules options pour @table_typesont: «TABLEAU SYSTÈME», «TABLE» et «AFFICHER».
Solomon Rutzky

0

Cela renverra tout le nom sp

Select * 
FROM sys.procedures where [type] = 'P' 
     AND is_ms_shipped = 0 
     AND [name] not like 'sp[_]%diagram%'

La condition sur [type]doit être [type] IN ('P', 'PC')sinon vous filtrez tous les proc stockés CLR qui sont potentiellement là.
Solomon Rutzky


0
select * from DatabaseName.INFORMATION_SCHEMA.ROUTINES where routine_type = 'PROCEDURE'

select * from DatabaseName.INFORMATION_SCHEMA.ROUTINES where routine_type ='procedure' and left(ROUTINE_NAME,3) not in('sp_', 'xp_', 'ms_')


   SELECT name, type   FROM dbo.sysobjects
 WHERE (type = 'P')

0
USE DBNAME

select ROUTINE_NAME from information_schema.routines 
where routine_type = 'PROCEDURE'


GO 

Cela fonctionnera sur mssql.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.