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.

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_')

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')

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'

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

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

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

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

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

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

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

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'

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;

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'

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

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;

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';

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'

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

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%'

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')

0
USE DBNAME

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


GO 

Będzie to działać na mssql.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.