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.

p.campbell
la source

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_')
Dave_H
la source
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')
Kevin
la source
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'
Mike
la source
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
Narendra Sharma
la source
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
MovGP0
la source
10

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

select *
  from sys.procedures
 where is_ms_shipped = 0
cbeuker
la source
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
Ardalan Shahgholi
la source
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
Lorena Pita
la source
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
NeverHopeless
la source
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
Cade Roux
la source
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'
Ray Koren
la source
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;
BaffledBill
la source
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'
Mohsen
la source
1
select *  
  from dbo.sysobjects
 where xtype = 'P'
   and status > 0
Bob Probst
la source
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;
LostCajun
la source
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';
The_Coder
la source
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'
Alexandru-Codrin Panaite
la source
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
Reza Zendehboudi
la source
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%'
HaveNoDisplayName
la source
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

Essayez ce lien codeplex, cet utilitaire aide à localiser toutes les procédures stockées à partir de la base de données SQL.

https://exportmssqlproc.codeplex.com/

Sandeep
la source
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')
Chandan Ravandur N
la source
0
USE DBNAME

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


GO 

Cela fonctionnera sur mssql.

user1556937
la source
0

Sélectionnez la liste des procédures stockées dans SQL Server. Reportez-vous ici pour en savoir plus: https://coderrooms.blogspot.com/2017/06/select-list-of-stored-procedure-in-sql.html

Ankur Tiwari
la source
1
Bonjour et bienvenue. Ce code ne semble pas faire ce que le titre suggère. Il semble simplement créer une procédure stockée qui renvoie une liste d'enregistrements à partir d'une PaymentDetailstable. L'OP souhaite une liste des procédures stockées réelles.
Jeremy Caney