Permintaan untuk mendaftar semua prosedur tersimpan


338

Permintaan apa yang dapat mengembalikan nama semua prosedur yang tersimpan dalam database SQL Server

Jika kueri bisa mengecualikan prosedur tersimpan sistem, itu akan lebih bermanfaat.

Jawaban:


499

Seperti yang dikatakan Mike, cara terbaik adalah menggunakan information_schema. Selama Anda tidak berada di database master, prosedur yang tersimpan sistem tidak akan dikembalikan.

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

Jika karena alasan tertentu Anda memiliki prosedur tersimpan non-sistem di master database, Anda dapat menggunakan kueri (ini akan memfilter prosedur yang paling tersimpan dalam sistem):

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

3
Jika Anda membuat diagram database, Anda mungkin mendapatkan banyak procs dimulai dengan 'dt_' di database Anda yang juga dapat Anda filter.
John Fouhy

+1 untuk skema informasi. layak dibaca: msdn.microsoft.com/en-us/library/ms186778.aspx
Shiham

Seharusnya "Selama Anda tidak berada di basis data [master] atau [msdb], ..."
Solomon Rutzky

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

4
Ini bekerja untuk saya di lingkungan bersama di MS-SQL 2008; dua sebelumnya tidak ...
Realto619

3
Siapa pun yang menggunakan SQL Server 2005 atau yang lebih baru harus menjauh dari dbo.sys*pandangan. Kueri ini juga: memfilter prosedur tersimpan CLR, tidak memfilter procs sistem yang tersimpan, dan mengembalikan [tipe] ketika diketahui bahwa [tipe] akan selalu menjadi 'P' karena ini adalah kondisi WHERE.
Solomon Rutzky

itu tidak akan berfungsi jika objek dalam database memiliki skema yang berbeda
Foyzul Karim

30

Dari pemahaman saya metode "disukai" adalah dengan menggunakan tabel information_schema:

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

catatan yang dikembalikan tampaknya tidak memiliki cara untuk membedakan prosedur yang tersimpan sistem

18

Berikut ini akan Mengembalikan Semua Prosedur dalam database yang dipilih

SELECT * FROM sys.procedures

ini telah dimodifikasi dan dibuat tanggal, dll. yang sangat berguna
ihightower

14

Anda dapat mencoba kueri ini untuk mendapatkan prosedur dan fungsi yang tersimpan:

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

Jika Anda menggunakan SQL Server 2005 yang berikut ini akan berfungsi:

select *
  from sys.procedures
 where is_ms_shipped = 0

ini akan memberikan hasil yang salah dan termasuk sistem seperti prosedur tersimpan diagram (sp_upgraddiagrams) di sql 2008
HaveNoDisplayName

@ Piyush Benar bahwa itu akan mengembalikan procs diagram, tetapi seseorang mungkin tidak menganggap mereka sebagai procs "sistem" karena mereka tidak datang dengan instalasi standar. OP tidak menentukan cara menangani itu sehingga tidak memfilternya tidak selalu salah.
Solomon Rutzky

@srutzky: - tapi tetap saja ini bukan sp dibuat oleh pengguna
HaveNoDisplayName

@Piyush Benar, tetapi seperti yang saya katakan, OP tidak menentukan cara menangani procs yang bukan "pengguna dibuat" atau "sistem". Dan tidak ada yang bertanya.
Solomon Rutzky

Jawaban yang bagus Terima kasih telah menyertakan "is_ms_shipped = 0."
Hans Vonn

8

Anda dapat menggunakan salah satu pertanyaan di bawah ini untuk menemukan daftar Prosedur Tersimpan dalam satu database:

Pertanyaan1:

    SELECT 
        *
    FROM sys.procedures;

Pertanyaan2:

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

Jika Anda ingin menemukan daftar semua SP di semua Database Anda dapat menggunakan kueri di bawah ini:

    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 contoh Anda menggunakan sp_msforeachdb adalah emas dan harus menjadi jawabannya. Berikut ini tautan yang saya temukan berbicara lebih banyak tentang sproc ini: weblogs.sqlteam.com/joew/archive/2008/08/27/60700.aspx
Mike Cheel

8

Pilih Semua Prosedur dan Tampilan yang Tersimpan

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

5

Ini juga dapat membantu untuk membuat daftar prosedur kecuali prosedur sistem:

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

Tidak ada alasan untuk digunakan sys.all_objectskarena Anda memfilter is_ms_shipped=0. Itu bisa berisi Pemicu DDL, tetapi itu akan disaring oleh type='p'. Anda mungkin juga menggunakannya sys.objects.
Solomon Rutzky

4

Sayangnya INFORMATION_SCHEMAtidak mengandung info tentang procs sistem.

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

1
Mengapa Anda menggunakan ini, bukan sys.procedures where is_ms_shipped = 0? Dan mengapa Anda menjalankan fungsi objectproperty(object_id, N'IsMSShipped')untuk setiap baris ketika ada bidang is_ms_shippedyang berisi nilai itu? Sepanjang garis yang sama, mengapa menjalankan fungsi itu lagi ketika [type] IN ('P', 'PC')melakukan hal yang sama? Metode ini tidak perlu rumit dan tidak efisien.
Solomon Rutzky

4

Hanya namanya saja:

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

3

Saya telah men-tweak posting LostCajun yang sangat baik di atas untuk mengecualikan prosedur yang tersimpan sistem. Saya juga menghapus "Ekstrak." dari kode karena saya tidak tahu untuk apa itu dan memberi saya kesalahan. Pernyataan "fetch next" di dalam loop juga membutuhkan klausul "menjadi".

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

cara terbaik untuk mendapatkan objek adalah menggunakan sys.sql_modules. Anda dapat menemukan setiap hal yang Anda inginkan dari tabel ini dan bergabung dengan tabel ini dengan tabel lain untuk mendapatkan informasi lebih lanjut dengan 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 tampaknya tidak membedakan antara prosedur yang tersimpan sistem dan yang dibuat

Hmm. Itu untuk kita - saya tidak tahu mengapa.
Bob Probst

Siapa pun yang menggunakan SQL Server 2005 atau yang lebih baru harus menjauh dari dbo.sys*pandangan. Kueri ini juga memfilter prosedur tersimpan CLR.
Solomon Rutzky

1

Saya menulis tsql sederhana ini untuk membuat daftar teks dari semua prosedur yang tersimpan. Pastikan untuk mengganti nama database Anda di bidang.

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;

silakan lihat penulisan ulang @BaffledBill tentang ini .. yang bekerja untuk saya. Yang ini tidak berfungsi karena ada banyak kesalahan.
ihightower

1

Ini hanya akan memberikan nama-nama prosedur yang tersimpan.

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

1

Ini akan menunjukkan semua prosedur tersimpan dan kode:

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

Ini, daftarkan semua hal yang Anda inginkan

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

ATAU

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

Tidak ada alasan untuk menggunakan, atau mendapat manfaat dari menggunakan sp_tables,. Juga, "PROSEDUR" bukan opsi yang valid untuk sp_tables. Satu-satunya pilihan @table_typeadalah: 'TABEL SISTEM', 'TABEL', dan 'LIHAT'.
Solomon Rutzky

0

Ini akan mengembalikan semua nama sp

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

Kondisi pada [type]harus [type] IN ('P', 'PC')lain Anda memfilter setiap proksi yang disimpan CLR yang berpotensi ada.
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 

Ini akan bekerja pada mssql.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.