Запит на перелік усіх збережених процедур


338

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

Якщо запит міг би виключити збережені в системі процедури, це було б ще корисніше.

Відповіді:


499

Як заявив Майк, найкращим способом є використання information_schema. Поки ви не знаходитесь у головній базі даних, системні збережені процедури не повертаються.

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

Якщо з якоїсь причини у базовій базі даних були несистемні процедури, які ви можете зберігати, ви можете скористатися запитом (це відфільтрує найпоширеніші системні процедури, що зберігаються):

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
Shiham

Це має бути "Поки ви не знаходитесь у базах даних [master] або [msdb], ..."
Соломон Руцький

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

4
Це працювало для мене в спільному середовищі в MS-SQL 2008; попередні два не зробили ...
Realto619

3
Усі, хто використовує SQL Server 2005 або новішу версію, повинні відійти від dbo.sys*поглядів. Цей запит також: відфільтровує збережені CLR процедури, не фільтрує збережені системою протоколи та повертає [type], коли відомо, що [type] завжди буде '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: - але все-таки ці користувача не створені користувачем
HaveNoDisplayName

@Piyush Правда, але, як я вже сказав, в ОП не було вказано, як обробляти програми, які не є ні "створеними користувачем", ні "системою". І ніхто не питав.
Соломон Руцький

Чудова відповідь. Дякуємо, що включили "is_ms_shipped = 0."
Ганс Вонн

8

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

Запит1:

    SELECT 
        *
    FROM sys.procedures;

Запит2:

    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 - це золото, і він повинен відповісти. Ось посилання, про яке я розповів більше про цю паростку: 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')робить те саме? Цей метод зайво складний і неефективний.
Соломон Руцький

4

Тільки імена:

SELECT SPECIFIC_NAME  
FROM YOUR_DB_NAME.information_schema.routines  
WHERE routine_type = 'PROCEDURE'

3

Я вже підкоригував чудовий пост 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

найкращий спосіб отримати об’єкти - використовувати 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

status> 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 .. що працювало на мене. Цей не працював, оскільки мав багато помилок.
ihightower

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

Виберіть список збереженої процедури на 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.