2008-10-20 2 views

ответ

369

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

select * 
    from DatabaseName.information_schema.routines 
where routine_type = 'PROCEDURE' 

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

select * 
    from master.information_schema.routines 
where routine_type = 'PROCEDURE' 
    and Left(Routine_Name, 3) NOT IN ('sp_', 'xp_', 'ms_') 
+2

Если вы создаете диаграммы баз данных, вы можете получить кучу проков, начинающихся с «dt_» в вашей базе данных, которые вы также можете отфильтровать. – 2013-06-12 00:16:13

+0

+1 для информационной схемы. стоит прочитать: http://msdn.microsoft.com/en-us/library/ms186778.aspx – Shiham 2014-09-16 08:34:18

+0

Это должно быть «До тех пор, пока вы не находитесь в [master] или [msdb] базах данных ...» – 2015-01-08 15:18:13

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

статус не кажется,> 0 различать системные хранимые процедуры и созданные – 2008-10-20 18:56:17

+0

Хмм , Это для нас - я не знаю, почему. – 2008-10-20 19:02:22

+0

Любой, кто использует SQL Server 2005 или новее, должен отойти от представлений `dbo.sys * '. Этот запрос также отфильтровывает хранимые процедуры CLR. – 2015-01-08 15:29:54

66
SELECT name, 
     type 
    FROM dbo.sysobjects 
WHERE (type = 'P') 
+1

Это работало для меня в общей среде в MS-SQL 2008; предыдущие два не ... – Realto619 2014-11-25 16:49:36

+3

Любой, кто использует SQL Server 2005 или новее, должен отойти от представлений `dbo.sys * '. Этот запрос также: отфильтровывает хранимые процедуры CLR, не отфильтровывает системные сохраненные procs и возвращает [type], когда известно, что [type] всегда будет «P», поскольку это условие WHERE. – 2015-01-08 15:25:28

24

В моем понимании "предпочтительный" метод заключается в использовании таблиц information_schema:

select * 
    from information_schema.routines 
where routine_type = 'PROCEDURE' 
+0

возвращенные записи, похоже, не имеют возможности различать системные хранимые процедуры. – 2008-10-20 18:57:04

3

К сожалению INFORMATION_SCHEMA Безразлично» t содержит информацию о системных процессах.

SELECT * 
    FROM sys.objects 
WHERE objectproperty(object_id, N'IsMSShipped') = 0 
    AND objectproperty(object_id, N'IsProcedure') = 1 
+0

Зачем вам использовать это вместо `sys.procedures где is_ms_shipped = 0`? И зачем вы запускаете функцию `objectproperty (object_id, N'IsMSShipped ')` для каждой строки, когда есть поле `is_ms_shipped`, которое содержит это значение? В тех же строках, зачем запускать эту функцию снова, когда `[type] IN ('P', 'PC')` делает то же самое? Этот метод излишне сложный и неэффективный. – 2015-01-08 16:03:24

9

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

select * 
    from sys.procedures 
where is_ms_shipped = 0 
+0

это даст неправильный результат и включит систему, подобную диаграмме хранимой процедуры (sp_upgraddiagrams) в sql 2008 – HaveNoDisplayName 2015-01-08 14:25:36

+0

@Piyush Истинно, что она вернет диаграмму procs, но кто-то _might_ не считает их «системными» процессами, так как они не пришли со стандартной установкой. O.P. не указал, как обращаться с тем, чтобы не отфильтровывать их не обязательно неправильно. – 2015-01-08 16:07:20

4

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

select * from sys.all_objects where type='p' and is_ms_shipped=0 
1

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

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

Ниже будет возвращать все процедуры в выбранной базе данных

SELECT * FROM sys.procedures 
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; 
0

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

Select * 
FROM sys.procedures where [type] = 'P' 
    AND is_ms_shipped = 0 
    AND [name] not like 'sp[_]%diagram%' 
11

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

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 
0

Чтобы получить список хранимых процедур для конкретной базы данных MySQL:

SHOW PROCEDURE STATUS WHERE db = 'databaseName'; 
1

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

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

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

QUERY1:

SELECT 
     * 
    FROM sys.procedures; 

Query2:

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

Если вы хочу найти список все СП во всех Базах данных вы можете используйте приведенный ниже запрос:

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

Я улучшил превосходное сообщение LostCajun выше, чтобы исключить системные хранимые процедуры. Я также удалил «Экстракт». из кода, потому что я не мог понять, для чего это, и это дало мне ошибки. Операция «выборка следующего» внутри цикла также требовала «в».

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

Выбрать Все Хранимые процедуры и просмотры

select name,type,type_desc 
from sys.objects 
where type in ('V','P') 
order by name,type 
0

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

SELECT SPECIFIC_NAME 
FROM YOUR_DB_NAME.information_schema.routines 
WHERE routine_type = 'PROCEDURE' 
Смежные вопросы