Запрос списка всех хранимых процедур

338

Какой запрос может вернуть имена всех хранимых процедур в базе данных SQL Server

Если бы запрос мог исключить системные хранимые процедуры, это было бы еще более полезно.

p.campbell
источник

Ответы:

499

Как заявил Майк, лучшим способом является использование information_schema. Пока вы не в главной базе данных, системные хранимые процедуры не будут возвращены.

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

Если по какой-либо причине у вас есть несистемные хранимые процедуры в базе данных master, вы можете использовать запрос (это отфильтрует большинство хранимых процедур системы):

SELECT * 
  FROM [master].INFORMATION_SCHEMA.ROUTINES
 WHERE ROUTINE_TYPE = 'PROCEDURE' 
   AND LEFT(ROUTINE_NAME, 3) NOT IN ('sp_', 'xp_', 'ms_')
Dave_H
источник
3
Если вы создаете диаграммы базы данных, вы можете получить в своей базе кучу процедур, начинающихся с 'dt_', которые вы также можете отфильтровать.
Джон Фухи
+1 за информационную схему. Стоит прочитать: msdn.microsoft.com/en-us/library/ms186778.aspx
Шихам
Это должно быть "Пока вы не в [master] или [msdb] базах данных, ..."
Соломон Руцки
107
SELECT name, 
       type
  FROM dbo.sysobjects
 WHERE (type = 'P')
Kevin
источник
4
Это работало для меня в общей среде в MS-SQL 2008; предыдущие два не ...
Realto619
3
Любой, кто использует SQL Server 2005 или новее, должен отойти от dbo.sys*представлений. Этот запрос также: отфильтровывает хранимые процедуры CLR, не отфильтровывает системные хранимые процедуры и возвращает [тип], когда известно, что [тип] всегда будет 'P', поскольку это условие WHERE.
Соломон Руцкий
это не будет работать, если объекты в базе данных имеют другую схему
Фойзул Карим
30

Насколько я понимаю, «предпочтительным» методом является использование таблиц information_schema:

select * 
  from information_schema.routines 
 where routine_type = 'PROCEDURE'
Майк
источник
Похоже, что возвращенные записи не позволяют дифференцировать хранимые процедуры системы
18

Следующее вернет все процедуры в выбранной базе данных

SELECT * FROM sys.procedures
Нарендра Шарма
источник
это был модифицирован и дате создания и т.д. , которые очень полезны
ihightower
14

Вы можете попробовать этот запрос, чтобы получить хранимые процедуры и функции:

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
источник
10

Если вы используете SQL Server 2005, будет работать следующее:

select *
  from sys.procedures
 where is_ms_shipped = 0
cbeuker
источник
это даст неверный результат и включит системную хранимую процедуру диаграммы (sp_upgraddiagrams) в SQL 2008
HaveNoDisplayName
@Piyush Верно, что он вернет процесс диаграммы, но кто-то может не считать их "системными" процессами, поскольку они не поставляются со стандартной установкой. ОП не указывал, как справиться с этим, поэтому не отфильтровывать их не обязательно неправильно.
Соломон Руцкий
@srutzky: - но все же это не sp, созданные пользователем
HaveNoDisplayName
@Piyush Правда, но, как я уже сказал, OP не указал, как обрабатывать проки, которые не являются ни «созданными пользователем», ни «системными». И никто не спросил.
Соломон Руцки
Отличный ответ. Спасибо, что включили "is_ms_shipped = 0."
Ганс Вонн
8

Вы можете использовать один из следующих запросов, чтобы найти список хранимых процедур в одной базе данных:

Query1:

    SELECT 
        *
    FROM sys.procedures;

Query2:

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

Если вы хотите найти список всех SP во всех базах данных, вы можете использовать следующий запрос:

    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 ваш пример с использованием sp_msforeachdb - это золото, и он должен быть ответом. Вот ссылка, которую я нашел, чтобы поговорить об этом sproc: weblogs.sqlteam.com/joew/archive/2008/08/27/60700.aspx
Майк Чил
8

Выбрать все хранимые процедуры и представления

select name,type,type_desc
from sys.objects
where type in ('V','P')
order by name,type
Лорена Пита
источник
5

Это также может помочь перечислить процедуру, кроме системных процедур:

select * from sys.all_objects where type='p' and is_ms_shipped=0
NeverHopeless
источник
Нет смысла использовать, sys.all_objectsтак как вы фильтруете is_ms_shipped=0. Он может содержать триггеры DDL, но они будут отфильтрованы type='p'. Вы могли бы также использовать sys.objects.
Соломон Руцкий
4

К сожалению INFORMATION_SCHEMA, не содержит информации о системных процессах.

SELECT *
  FROM sys.objects
 WHERE objectproperty(object_id, N'IsMSShipped') = 0
   AND objectproperty(object_id, N'IsProcedure') = 1
Кейд Ру
источник
1
Почему вы используете это вместо sys.procedures where is_ms_shipped = 0? И зачем запускать функцию objectproperty(object_id, N'IsMSShipped')для каждой строки, когда есть поле is_ms_shipped, содержащее это значение? В том же духе, зачем запускать эту функцию снова, когда [type] IN ('P', 'PC')делает то же самое? Этот метод излишне сложен и неэффективен.
Соломон Руцкий
4

Просто имена:

SELECT SPECIFIC_NAME  
FROM YOUR_DB_NAME.information_schema.routines  
WHERE routine_type = 'PROCEDURE'
Рэй Корен
источник
3

Я подправил отличный пост LostCajun выше, чтобы исключить системные хранимые процедуры. Я также удалил "Извлечь". из кода, потому что я не мог понять, для чего он нужен, и это дало мне ошибки. Оператору «fetch next» внутри цикла также требовалось предложение «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
источник
2

лучший способ получить объекты - использовать sys.sql_modules. из этой таблицы вы можете найти все, что хотите, и объединить эту таблицу с другой таблицей, чтобы получить дополнительную информацию по 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
Боб Пробст
источник
статус> 0, кажется, не делает различий между системными хранимыми процедурами и созданными
Хм. Это для нас - я не знаю почему.
Боб Пробст
Любой, кто использует SQL Server 2005 или новее, должен отойти от dbo.sys*представлений. Этот запрос также отфильтровывает хранимые процедуры CLR.
Соломон Руцки
1

Я написал этот простой tsql, чтобы перечислить текст всех хранимых процедур. Не забудьте подставить имя вашей базы данных в поле.

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
источник
пожалуйста, смотрите переписывание @BaffledBill этого .. который работал для меня. Этот не сработал, так как в нем было много ошибок.
Высшая башня
1

Это даст только имена хранимых процедур.

select specific_name
from information_schema.routines
where routine_type = 'PROCEDURE';
The_Coder
источник
1

Это покажет все хранимые процедуры и код:

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

Это, список всех вещей, которые вы хотите

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

ИЛИ

SELECT * FROM information_schema.tables
SELECT * FROM information_schema.VIEWS
Реза Зендехбоуди
источник
Нет причин использовать или извлекать выгоду из использования sp_tables. Кроме того, «ПРОЦЕДУРА» не является допустимым параметром для sp_tables. Доступны только следующие опции @table_type: «СИСТЕМНАЯ ТАБЛИЦА», «ТАБЛИЦА» и «ПРОСМОТР».
Соломон Руцкий
0

Это будет возвращено все имя SP

Select * 
FROM sys.procedures where [type] = 'P' 
     AND is_ms_shipped = 0 
     AND [name] not like 'sp[_]%diagram%'
HaveNoDisplayName
источник
Условие [type]должно быть в [type] IN ('P', 'PC')противном случае вы отфильтровываете любые хранимые проки CLR, которые могут быть там.
Соломон Руцкий
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 

Это будет работать на MSSQL.

user1556937
источник
0

Выберите список хранимых процедур на сервере SQL. За дополнительной информацией обращайтесь сюда: https://coderrooms.blogspot.com/2017/06/select-list-of-stored-procedure-in-sql.html

Анкур Тивари
источник
1
Привет и добро пожаловать. Этот код, кажется, не делает то, что предлагает заголовок. Похоже, просто создать хранимую процедуру, которая возвращает список записей из PaymentDetailsтаблицы. ОП хочет список фактических хранимых процедур.
Джереми Кейни