Abfrage zum Auflisten aller gespeicherten Prozeduren

338

Welche Abfrage kann die Namen aller gespeicherten Prozeduren in einer SQL Server-Datenbank zurückgeben

Wenn die Abfrage gespeicherte Systemprozeduren ausschließen könnte, wäre dies noch hilfreicher.

p.campbell
quelle

Antworten:

499

Wie Mike sagte, ist der beste Weg zu verwenden information_schema. Solange Sie sich nicht in der Master-Datenbank befinden, werden gespeicherte Systemprozeduren nicht zurückgegeben.

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

Wenn Sie aus irgendeinem Grund nicht vom System gespeicherte Prozeduren in der Masterdatenbank hatten, können Sie die Abfrage verwenden (dies filtert die meisten gespeicherten Systemprozeduren heraus):

SELECT * 
  FROM [master].INFORMATION_SCHEMA.ROUTINES
 WHERE ROUTINE_TYPE = 'PROCEDURE' 
   AND LEFT(ROUTINE_NAME, 3) NOT IN ('sp_', 'xp_', 'ms_')
Dave_H
quelle
3
Wenn Sie Datenbankdiagramme erstellen, erhalten Sie möglicherweise eine Reihe von Prozessen, die mit 'dt_' in Ihrer Datenbank beginnen und die Sie auch herausfiltern können.
John Fouhy
+1 für Informationsschema. eine Lektüre wert: msdn.microsoft.com/en-us/library/ms186778.aspx
Shiham
Es sollte lauten "Solange Sie nicht in den Datenbanken [master] oder [msdb] sind, ..."
Solomon Rutzky
107
SELECT name, 
       type
  FROM dbo.sysobjects
 WHERE (type = 'P')
Kevin
quelle
4
Dies funktionierte für mich in einer gemeinsam genutzten Umgebung in MS-SQL 2008. die vorherigen beiden nicht ...
Realto619
3
Jeder, der SQL Server 2005 oder höher verwendet, sollte sich von den dbo.sys*Ansichten entfernen . Diese Abfrage: filtert gespeicherte CLR-Prozeduren heraus, filtert gespeicherte Systemprozesse nicht heraus und gibt [Typ] zurück, wenn bekannt ist, dass [Typ] immer 'P' ist, da dies die WHERE-Bedingung ist.
Solomon Rutzky
es wird nicht funktionieren, wenn die Objekte in der Datenbank ein anderes Schema haben
Foyzul Karim
30

Nach meinem Verständnis besteht die "bevorzugte" Methode darin, die Tabellen information_schema zu verwenden:

select * 
  from information_schema.routines 
 where routine_type = 'PROCEDURE'
Mike
quelle
Die zurückgegebenen Datensätze scheinen keine Möglichkeit zu haben, die gespeicherten Systemprozeduren zu unterscheiden
18

Im Folgenden werden alle Prozeduren in der ausgewählten Datenbank zurückgegeben

SELECT * FROM sys.procedures
Narendra Sharma
quelle
Dies wurde geändert und erstellt Datum usw., was sehr nützlich ist
ihightower
14

Sie können diese Abfrage versuchen, um gespeicherte Prozeduren und Funktionen abzurufen:

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
quelle
10

Wenn Sie SQL Server 2005 verwenden, funktioniert Folgendes:

select *
  from sys.procedures
 where is_ms_shipped = 0
cbeuker
quelle
Dies führt zu einem falschen Ergebnis und enthält eine systemähnliche gespeicherte Prozedur (sp_upgraddiagrams) in SQL 2008
HaveNoDisplayName
@Piyush Stimmt, dass die Diagrammprozesse zurückgegeben werden, aber jemand betrachtet sie möglicherweise nicht als "System" -Prozesse, da sie nicht mit der Standardinstallation geliefert wurden. Das OP hat nicht angegeben, wie damit umgegangen werden soll, daher ist es nicht unbedingt falsch, sie nicht herauszufiltern.
Solomon Rutzky
@srutzky: - aber immer noch sind diese nicht
SPs
@Piyush True, aber wie gesagt, das OP hat nicht angegeben, wie mit Prozessen umgegangen werden soll, die weder vom Benutzer erstellt noch vom System erstellt wurden. Und niemand hat gefragt.
Solomon Rutzky
Gute Antwort. Vielen Dank, dass Sie "is_ms_shipped = 0" hinzugefügt haben.
Hans Vonn
8

Sie können eine der folgenden Abfragen verwenden, um die Liste der gespeicherten Prozeduren in einer Datenbank zu finden:

Abfrage1:

    SELECT 
        *
    FROM sys.procedures;

Abfrage2:

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

Wenn Sie die Liste aller SPs in allen Datenbanken finden möchten, können Sie die folgende Abfrage verwenden:

    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
quelle
1
IMO ist Ihr Beispiel mit sp_msforeachdb Gold und sollte die Antwort sein. Hier ist ein Link, über den ich mehr über diesen Sproc gesprochen habe: weblogs.sqlteam.com/joew/archive/2008/08/27/60700.aspx
Mike Cheel
8

Wählen Sie Alle gespeicherten Prozeduren und Ansichten aus

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

Dies kann auch dazu beitragen, Prozeduren mit Ausnahme der Systemprozeduren aufzulisten:

select * from sys.all_objects where type='p' and is_ms_shipped=0
NeverHopeless
quelle
Es gibt keinen Grund zur Verwendung, sys.all_objectsda Sie weiter filtern is_ms_shipped=0. Es kann DDL-Trigger enthalten, die jedoch von herausgefiltert werden type='p'. Sie könnten genauso gut verwenden sys.objects.
Solomon Rutzky
4

INFORMATION_SCHEMAEnthält leider keine Informationen zu den Systemprozessen.

SELECT *
  FROM sys.objects
 WHERE objectproperty(object_id, N'IsMSShipped') = 0
   AND objectproperty(object_id, N'IsProcedure') = 1
Cade Roux
quelle
1
Warum würden Sie dies anstelle von verwenden sys.procedures where is_ms_shipped = 0? Und warum sollten Sie objectproperty(object_id, N'IsMSShipped')für jede Zeile eine Funktion ausführen, wenn es ein Feld gibt is_ms_shipped, das diesen Wert enthält? Warum sollte diese Funktion in diesem Sinne erneut ausgeführt werden, wenn [type] IN ('P', 'PC')dasselbe funktioniert ? Diese Methode ist unnötig kompliziert und ineffizient.
Solomon Rutzky
4

Nur die Namen:

SELECT SPECIFIC_NAME  
FROM YOUR_DB_NAME.information_schema.routines  
WHERE routine_type = 'PROCEDURE'
Ray Koren
quelle
3

Ich habe den hervorragenden Beitrag von LostCajun oben optimiert, um gespeicherte Systemprozeduren auszuschließen. Ich habe auch "Extrahieren" entfernt. aus dem Code, weil ich nicht herausfinden konnte, wofür es ist und es mir Fehler gab. Die Anweisung "fetch next" in der Schleife benötigte ebenfalls eine "into" -Klausel.

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
quelle
2

Der beste Weg, um Objekte zu erhalten, ist die Verwendung von sys.sql_modules. Sie können alles, was Sie wollen, aus dieser Tabelle finden und diese Tabelle mit einer anderen Tabelle verbinden, um weitere Informationen über object_id zu erhalten

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
quelle
1
select *  
  from dbo.sysobjects
 where xtype = 'P'
   and status > 0
Bob Probst
quelle
Status> 0 scheint nicht zwischen gespeicherten Systemprozeduren und den erstellten zu unterscheiden
Hmm. Das tut es für uns - ich weiß nicht warum.
Bob Probst
Jeder, der SQL Server 2005 oder höher verwendet, sollte sich von den dbo.sys*Ansichten entfernen . Diese Abfrage filtert auch gespeicherte CLR-Prozeduren heraus.
Solomon Rutzky
1

Ich habe diese einfache tsql geschrieben, um den Text aller gespeicherten Prozeduren aufzulisten. Stellen Sie sicher, dass Sie Ihren Datenbanknamen im Feld ersetzen.

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
quelle
Bitte sehen Sie @BaffledBills Umschreibung davon .. was für mich funktioniert hat. Dieser hat nicht funktioniert, da er viele Fehler hatte.
ihightower
1

Dies gibt nur die Namen der gespeicherten Prozeduren an.

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

Dies zeigt alle gespeicherten Prozeduren und den 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
quelle
0

Listen Sie hier alle gewünschten Dinge auf

In 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'" 

ODER

SELECT * FROM information_schema.tables
SELECT * FROM information_schema.VIEWS
Reza Zendehboudi
quelle
Es gibt keinen Grund, sie zu verwenden oder davon zu profitieren sp_tables. Außerdem ist "PROCEDURE" keine gültige Option für sp_tables. Die einzigen Optionen für @table_typesind: 'SYSTEM TABLE', 'TABLE' und 'VIEW'.
Solomon Rutzky
0

Dies gibt alle SP-Namen zurück

Select * 
FROM sys.procedures where [type] = 'P' 
     AND is_ms_shipped = 0 
     AND [name] not like 'sp[_]%diagram%'
HaveNoDisplayName
quelle
Die Bedingung [type]sollte sein [type] IN ('P', 'PC'), dass Sie alle CLR-gespeicherten Prozesse herausfiltern, die möglicherweise vorhanden sind.
Solomon Rutzky
0

Versuchen Sie diesen Codeplex-Link, dieses Hilfsprogramm, um alle gespeicherten Prozeduren aus der SQL-Datenbank zu lokalisieren.

https://exportmssqlproc.codeplex.com/

Sandeep
quelle
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.
quelle
0
USE DBNAME

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


GO 

Dies wird auf mssql funktionieren.

user1556937
quelle
0

Wählen Sie eine Liste der gespeicherten Prozeduren in SQL Server aus. Weitere Informationen finden Sie hier: https://coderrooms.blogspot.com/2017/06/select-list-of-stored-procedure-in-sql.html

Ankur Tiwari
quelle
1
Hallo und Willkommen. Dieser Code scheint nicht das zu tun, was der Titel vorschlägt. Es scheint nur eine gespeicherte Prozedur zu erstellen, die eine Liste von Datensätzen aus einer PaymentDetailsTabelle zurückgibt . Das OP möchte eine Liste der tatsächlich gespeicherten Prozeduren.
Jeremy Caney