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


338

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

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

Ответы:


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

3
Если вы создаете диаграммы базы данных, вы можете получить в своей базе кучу процедур, начинающихся с 'dt_', которые вы также можете отфильтровать.
Джон Фухи

+1 за информационную схему. Стоит прочитать: msdn.microsoft.com/en-us/library/ms186778.aspx
Шихам

Это должно быть "Пока вы не в [master] или [msdb] базах данных, ..."
Соломон Руцки

107
SELECT name, 
       type
  FROM dbo.sysobjects
 WHERE (type = 'P')

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

10

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

select *
  from sys.procedures
 where is_ms_shipped = 0

это даст неверный результат и включит системную хранимую процедуру диаграммы (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

Нет смысла использовать, 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')делает то же самое? Этот метод излишне сложен и неэффективен.
Соломон Руцкий


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;

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;

пожалуйста, смотрите переписывание @BaffledBill этого .. который работал для меня. Этот не сработал, так как в нем было много ошибок.
Высшая башня

1

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

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

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

Условие [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.


0

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


1
Привет и добро пожаловать. Этот код, кажется, не делает то, что предлагает заголовок. Похоже, просто создать хранимую процедуру, которая возвращает список записей из PaymentDetailsтаблицы. ОП хочет список фактических хранимых процедур.
Джереми Кейни
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.