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.
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.
Antworten:
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_')
SELECT name,
type
FROM dbo.sysobjects
WHERE (type = 'P')
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.
Nach meinem Verständnis besteht die "bevorzugte" Methode darin, die Tabellen information_schema zu verwenden:
select *
from information_schema.routines
where routine_type = 'PROCEDURE'
Im Folgenden werden alle Prozeduren in der ausgewählten Datenbank zurückgegeben
SELECT * FROM sys.procedures
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
Wenn Sie SQL Server 2005 verwenden, funktioniert Folgendes:
select *
from sys.procedures
where is_ms_shipped = 0
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
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
Dies kann auch dazu beitragen, Prozeduren mit Ausnahme der Systemprozeduren aufzulisten:
select * from sys.all_objects where type='p' and is_ms_shipped=0
sys.all_objects
da 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
.
INFORMATION_SCHEMA
Enthä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
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.
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;
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'
select *
from dbo.sysobjects
where xtype = 'P'
and status > 0
dbo.sys*
Ansichten entfernen . Diese Abfrage filtert auch gespeicherte CLR-Prozeduren heraus.
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;
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'
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
sp_tables
. Außerdem ist "PROCEDURE" keine gültige Option für sp_tables
. Die einzigen Optionen für @table_type
sind: 'SYSTEM TABLE', 'TABLE' und 'VIEW'.
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%'
[type]
sollte sein [type] IN ('P', 'PC')
, dass Sie alle CLR-gespeicherten Prozesse herausfiltern, die möglicherweise vorhanden sind.
Versuchen Sie diesen Codeplex-Link, dieses Hilfsprogramm, um alle gespeicherten Prozeduren aus der SQL-Datenbank zu lokalisieren.
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')
USE DBNAME
select ROUTINE_NAME from information_schema.routines
where routine_type = 'PROCEDURE'
GO
Dies wird auf mssql funktionieren.
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
PaymentDetails
Tabelle zurückgibt . Das OP möchte eine Liste der tatsächlich gespeicherten Prozeduren.