Saklanan tüm yordamları listeleme sorgusu


338

Hangi sorgu bir SQL Server veritabanında depolanan tüm yordamların adlarını döndürebilir

Sorgu sistemde saklı yordamları hariç tutabilirse, bu daha da yararlı olacaktır.

Yanıtlar:


499

Mike'ın belirttiği gibi, en iyi yol kullanmaktır information_schema. Ana veritabanında olmadığınız sürece, sistemde saklı yordamlar döndürülmez.

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

Herhangi bir nedenle ana veritabanında sistem dışı saklı yordamlarınız varsa, sorguyu kullanabilirsiniz (bu, MOST sistem saklı yordamlarını filtreleyecektir):

SELECT * 
  FROM [master].INFORMATION_SCHEMA.ROUTINES
 WHERE ROUTINE_TYPE = 'PROCEDURE' 
   AND LEFT(ROUTINE_NAME, 3) NOT IN ('sp_', 'xp_', 'ms_')

3
Veritabanı diyagramları oluşturursanız, veritabanınızda 'dt_' ile başlayan ve ayrıca filtreleyebileceğiniz bir grup proc alabilirsiniz.
John Fouhy

Bilgi şeması için +1. okumaya değer: msdn.microsoft.com/en-us/library/ms186778.aspx
Shiham

"[Master] veya [msdb] veritabanlarında olmadığınız sürece ..." olmalıdır
Solomon Rutzky

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

4
Bu benim için MS-SQL 2008'de paylaşılan bir ortamda çalıştı; önceki iki değil ...
Realto619

3
SQL Server 2005 veya daha yenisini kullanan herkes dbo.sys*görünümlerden uzaklaşmalıdır . Bu sorgu ayrıca: CLR saklı yordamlarını filtreler, sistem saklı yordamları filtrelemez ve WHERE koşulu olduğu için [type] 'ın her zaman' P 'olacağı bilindiğinde [type] değerini döndürür.
Solomon Rutzky

Veritabanındaki nesnelerin şemaları
farklıysa çalışmaz

30

Anladığım kadarıyla "tercih edilen" yöntem, information_schema tablolarını kullanmaktır:

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

döndürülen kayıtların sistemde saklı yordamları ayırt etmek için bir yolu yok gibi görünüyor

18

Aşağıdaki seçili veritabanındaki tüm yordamları döndürür

SELECT * FROM sys.procedures

bu değiştirildi ve tarih, vb. oluşturuldu. Bu çok yararlı
ihightower

14

Saklı yordamları ve işlevleri almak için bu sorguyu deneyebilirsiniz:

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 kullanıyorsanız aşağıdakiler çalışır:

select *
  from sys.procedures
 where is_ms_shipped = 0

bu yanlış sonuç verir ve sql 2008'de diyagram saklı yordam (sp_upgraddiagrams) gibi sistem içerir
HaveNoDisplayName

@Piyush Doğru o diyagram procs dönecek ama birisi olabilir onlar standart yüklemek gelmedi çünkü onlara "sistem" procs olmak düşünmüyoruz. OP bunun nasıl ele alınacağını belirtmedi, bu yüzden onları filtrelemenin mutlaka yanlış olması gerekmez.
Solomon Rutzky

@srutzky: - ama yine de bunlar kullanıcı tarafından oluşturulan sp değil
HaveNoDisplayName

@Piyush Doğru, ama dediğim gibi, OP ne "kullanıcı tarafından oluşturulan" ne de "sistem" olmayan procların nasıl işleneceğini belirtmedi. Ve kimse sormadı.
Solomon Rutzky

Mükemmel cevap. "İs_ms_shipped = 0" eklediğiniz için teşekkür ederiz.
Hans Vonn

8

Bir veritabanında Saklı Yordamlar listesini bulmak için aşağıdaki sorgulardan birini kullanabilirsiniz:

Sorgu1:

    SELECT 
        *
    FROM sys.procedures;

Sorgu2:

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

Tüm Veritabanlarındaki tüm SP'lerin listesini bulmak istiyorsanız aşağıdaki sorguyu kullanabilirsiniz:

    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 kullanarak örnek altın ve cevap olmalıdır. İşte bu sproc hakkında daha fazla konuştuğum bir bağlantı: weblogs.sqlteam.com/joew/archive/2008/08/27/60700.aspx
Mike Cheel

8

Tüm Saklı Yordamları ve Görünümleri Seçme

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

5

Bu, sistem prosedürleri dışında prosedürün listelenmesine de yardımcı olabilir:

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

sys.all_objectsFiltrelediğiniz için kullanmanız için hiçbir neden yoktur is_ms_shipped=0. DDL Tetikleyicileri içerebilir, ancak bunlar tarafından filtrelenir type='p'. Siz de kullanabilirsiniz sys.objects.
Solomon Rutzky

4

Maalesef INFORMATION_SCHEMAsistem süreçleri hakkında bilgi içermiyor.

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

1
Bunu neden yerine kullanasın ki sys.procedures where is_ms_shipped = 0? Ve bu değeri içeren objectproperty(object_id, N'IsMSShipped')bir alan olduğunda neden her satır için bir işlev çalıştırıyorsunuz is_ms_shipped? Aynı hatlar boyunca [type] IN ('P', 'PC'), aynı şeyi ne zaman yapar? Bu yöntem gereksiz yere karmaşık ve verimsizdir.
Solomon Rutzky

4

Sadece isimler:

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

3

Sistem saklı yordamları hariç tutmak için yukarıdaki LostCajun mükemmel yazı tweaked. Ayrıca "Extract" ı da kaldırdım. çünkü bunun ne olduğunu anlayamadım ve bana hata verdi. Döngü içindeki "sonraki getir" deyimi de "içine" deyimine ihtiyaç duyuyordu.

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

nesneleri elde etmenin en iyi yolu sys.sql_modules kullanmaktır. object_id ile daha fazla bilgi almak için bu tablodan istediğiniz her şeyi bulabilir ve bu tabloya başka bir tabloyla katılabilirsiniz.

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, sistem saklı yordamları ve oluşturulan yordamlar arasında ayrım gözükmüyor

Hmm. Bizim için yapar - neden bilmiyorum.
Bob Probst

SQL Server 2005 veya daha yenisini kullanan herkes dbo.sys*görünümlerden uzaklaşmalıdır . Bu sorgu ayrıca CLR saklı yordamlarını da filtreler.
Solomon Rutzky

1

Tüm saklı yordamların metnini listelemek için bu basit tsql yazdım. Veritabanı adınızı yerine koyduğunuzdan emin olun.

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;

lütfen @BaffledBill'in bana yazdığı .. Çok fazla hata olduğu için bu işe yaramadı.
ihightower

1

Bu sadece saklı yordamların adlarını verecektir.

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

1

Bu, tüm saklı yordamları ve kodu gösterecektir:

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

Bu, istediğiniz her şeyi listeleyin

Sql Server 2005, 2008, 2012'de:

Use [YourDataBase]

EXEC sp_tables @table_type = "'PROCEDURE'" 
EXEC sp_tables @table_type = "'TABLE'"
EXEC sp_tables @table_type = "'VIEW'" 

VEYA

SELECT * FROM information_schema.tables
SELECT * FROM information_schema.VIEWS

Kullanmak veya kullanmaktan faydalanmak için hiçbir neden yoktur sp_tables. Ayrıca, "PROSEDÜR" için geçerli bir seçenek değildir sp_tables. Tek seçenekler @table_typeşunlardır: 'SİSTEM TABLOSU', 'TABLO' ve 'GÖRÜNÜM'.
Solomon Rutzky

0

Bu, tüm sp adını döndürecektir

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

Durum , potansiyel olarak orada bulunan herhangi bir CLR saklı proks filtreliyor olmanız [type]gerekir [type] IN ('P', 'PC').
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 

Bu mssql üzerinde çalışacaktır.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.