Zapytanie, aby wyświetlić listę wszystkich procedur przechowywanych

338

Jakie zapytanie może zwrócić nazwy wszystkich procedur przechowywanych w bazie danych SQL Server

Jeśli zapytanie mogłoby wykluczyć systemowe procedury składowane, byłoby to jeszcze bardziej pomocne.

p.campbell
źródło

Odpowiedzi:

499

Jak stwierdził Mike, najlepszym sposobem jest użycie information_schema. Dopóki nie znajdujesz się w głównej bazie danych, systemowe procedury składowane nie będą zwracane.

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

Jeśli z jakiegoś powodu masz niesystemowe procedury składowane w głównej bazie danych, możesz użyć zapytania (spowoduje to odfiltrowanie MOST systemowych procedur przechowywanych):

SELECT * 
  FROM [master].INFORMATION_SCHEMA.ROUTINES
 WHERE ROUTINE_TYPE = 'PROCEDURE' 
   AND LEFT(ROUTINE_NAME, 3) NOT IN ('sp_', 'xp_', 'ms_')
Dave_H
źródło
3
Jeśli utworzysz diagramy bazy danych, możesz uzyskać kilka procesów zaczynających się od „dt_” w bazie danych, które możesz również odfiltrować.
John Fouhy
+1 za schemat informacyjny. warte przeczytania: msdn.microsoft.com/en-us/library/ms186778.aspx
Shiham
Powinno to być: „Dopóki nie ma się bazy danych [master] lub [msdb], ...”
Solomon Rutzky
107
SELECT name, 
       type
  FROM dbo.sysobjects
 WHERE (type = 'P')
Kevin
źródło
4
Działa to dla mnie we wspólnym środowisku w MS-SQL 2008; poprzednie dwa nie ...
Realto619,
3
Każda osoba korzystająca z SQL Server 2005 lub nowszej powinna odejść od dbo.sys*widoków. To zapytanie również: odfiltrowuje procedury składowane CLR, nie odfiltrowuje przechowywanych procesów systemowych i zwraca [typ], gdy wiadomo, że [typ] zawsze będzie miał wartość „P”, ponieważ jest to warunek GDZIE.
Solomon Rutzky
nie zadziała, jeśli obiekty w bazie danych mają inny schemat
Foyzul Karim
30

Z mojego zrozumienia „preferowaną” metodą jest użycie tabel information_schema:

select * 
  from information_schema.routines 
 where routine_type = 'PROCEDURE'
Mikrofon
źródło
zwrócone rekordy nie wydają się mieć sposobu na różnicowanie procedur przechowywanych w systemie
18

Poniższe spowoduje zwrócenie wszystkich procedur w wybranej bazie danych

SELECT * FROM sys.procedures
Narendra Sharma
źródło
zostało to zmodyfikowane i utworzono datę itp., co jest bardzo przydatne
ihightower 19.04.17
14

Możesz wypróbować to zapytanie, aby uzyskać procedury składowane i funkcje:

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
źródło
10

Jeśli używasz programu SQL Server 2005, następujące funkcje będą działać:

select *
  from sys.procedures
 where is_ms_shipped = 0
cbeuker
źródło
da to zły wynik i obejmie procedurę przechowywaną podobną do systemu (sp_upgraddiagrams) w SQL 2008
HaveNoDisplayName
@Piyush Prawda, że ​​zwróci proces z diagramu, ale ktoś może nie uznać ich za proces z „systemu”, ponieważ nie przyszedł ze standardową instalacją. OP nie określił, jak sobie z tym poradzić, więc niefiltrowanie ich niekoniecznie jest błędne.
Solomon Rutzky
@srutzky: - ale nadal nie są one tworzone przez użytkownika
HaveNoDisplayName
@Piyush Prawda, ale jak powiedziałem, PO nie określił, jak obsługiwać procy, które nie są ani „tworzone przez użytkownika”, ani „system”. I nikt nie pytał.
Solomon Rutzky
Świetna odpowiedź. Dziękujemy za dołączenie „is_ms_shipped = 0.”
Hans Vonn
8

Możesz użyć jednego z poniższych zapytań, aby znaleźć listę procedur przechowywanych w jednej bazie danych:

Zapytanie 1:

    SELECT 
        *
    FROM sys.procedures;

Zapytanie 2:

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

Jeśli chcesz znaleźć listę wszystkich SP we wszystkich bazach danych , możesz użyć poniższego zapytania:

    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
źródło
1
IMO twój przykład używając sp_msforeachdb jest złoty i powinien być odpowiedzią. Oto link, o którym mówiłem więcej o tym sproc: weblogs.sqlteam.com/joew/archive/2008/08/27/60700.aspx
Mike Cheel
8

Wybierz Wszystkie przechowywane procedury i widoki

select name,type,type_desc
from sys.objects
where type in ('V','P')
order by name,type
Lorena Pita
źródło
5

Może to również pomóc w liście procedur oprócz procedur systemowych:

select * from sys.all_objects where type='p' and is_ms_shipped=0
NeverHopeless
źródło
Nie ma powodu, aby używać, sys.all_objectsponieważ filtrujesz is_ms_shipped=0. Może zawierać wyzwalacze DDL, ale zostaną one odfiltrowane type='p'. Równie dobrze możesz użyć sys.objects.
Solomon Rutzky
4

Niestety INFORMATION_SCHEMAnie zawiera informacji o procesach systemowych.

SELECT *
  FROM sys.objects
 WHERE objectproperty(object_id, N'IsMSShipped') = 0
   AND objectproperty(object_id, N'IsProcedure') = 1
Cade Roux
źródło
1
Dlaczego miałbyś użyć tego zamiast sys.procedures where is_ms_shipped = 0? I dlaczego miałbyś uruchamiać funkcję objectproperty(object_id, N'IsMSShipped')dla każdego wiersza, gdy istnieje pole is_ms_shippedzawierające tę wartość? Po tych samych liniach, po co ponownie uruchamiać tę funkcję, skoro [type] IN ('P', 'PC')robi to samo? Ta metoda jest niepotrzebnie skomplikowana i nieefektywna.
Solomon Rutzky
4

Tylko imiona:

SELECT SPECIFIC_NAME  
FROM YOUR_DB_NAME.information_schema.routines  
WHERE routine_type = 'PROCEDURE'
Ray Koren
źródło
3

Poprawiłem doskonały post LostCajun powyżej, aby wykluczyć procedury składowane w systemie. Usunąłem również „Wypakuj”. z kodu, ponieważ nie mogłem zrozumieć, do czego to służy i dało mi to błędy. Instrukcja „pobierz dalej” wewnątrz pętli również wymagała klauzuli „do”.

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
źródło
2

najlepszym sposobem na uzyskanie obiektów jest użycie sys.sql_modules. możesz znaleźć wszystkie rzeczy, które chcesz z tej tabeli i połączyć tę tabelę z inną tabelą, aby uzyskać więcej informacji przez 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
źródło
1
select *  
  from dbo.sysobjects
 where xtype = 'P'
   and status > 0
Bob Probst
źródło
status> 0 wydaje się nie rozróżniać między procedurami przechowywanymi w systemie a tymi utworzonymi
Hmm Robi to dla nas - nie wiem dlaczego.
Bob Probst,
Każda osoba korzystająca z SQL Server 2005 lub nowszej powinna odejść od dbo.sys*widoków. To zapytanie odfiltrowuje również procedury składowane CLR.
Solomon Rutzky
1

Napisałem ten prosty tsql, aby wyświetlić tekst wszystkich procedur przechowywanych. Podaj nazwę bazy danych w polu.

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
źródło
zapoznaj się z przepisem @BaffledBill tego .., który zadziałał dla mnie. Ten nie działał, ponieważ miał wiele błędów.
ihightower
1

To da tylko nazwy procedur przechowywanych.

select specific_name
from information_schema.routines
where routine_type = 'PROCEDURE';
The_Coder
źródło
1

To pokaże wszystkie procedury przechowywane i kod:

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
źródło
0

Wymień wszystkie rzeczy, które chcesz

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

LUB

SELECT * FROM information_schema.tables
SELECT * FROM information_schema.VIEWS
Reza Zendehboudi
źródło
Nie ma powodu, aby użyć lub korzyści używania sp_tables. Ponadto „PROCEDURA” nie jest prawidłową opcją dla sp_tables. Jedyne opcje @table_typeto: „SYSTEM TABLE”, „TABLE” i „VIEW”.
Solomon Rutzky
0

To zwróci wszystkie nazwy sp

Select * 
FROM sys.procedures where [type] = 'P' 
     AND is_ms_shipped = 0 
     AND [name] not like 'sp[_]%diagram%'
HaveNoDisplayName
źródło
Warunkiem włączenia [type]powinno być [type] IN ('P', 'PC')odfiltrowanie wszelkich przechowywanych procesów CLR, które potencjalnie tam są.
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')
Chandan Ravandur N.
źródło
0
USE DBNAME

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


GO 

Będzie to działać na mssql.

użytkownik1556937
źródło
0

Wybierz listę procedur przechowywanych w serwerze SQL. Więcej informacji można znaleźć tutaj: https://coderrooms.blogspot.com/2017/06/select-list-of-stored-procedure-in-sql.html

Ankur Tiwari
źródło
1
Cześć i witaj. Wydaje się, że ten kod nie robi tego, co sugeruje tytuł. Wydaje się, że po prostu tworzy procedurę składowaną, która zwraca listę rekordów z PaymentDetailstabeli. OP chce listy faktycznych procedur przechowywanych.
Jeremy Caney