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.

p.campbell
sumber

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_')
Dave_H
sumber
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')
Kevin
sumber
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'
Mike
sumber
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
Narendra Sharma
sumber
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
MovGP0
sumber
10

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

select *
  from sys.procedures
 where is_ms_shipped = 0
cuker
sumber
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
Ardalan Shahgholi
sumber
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
Lorena Pita
sumber
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 yang hilang
sumber
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
Cade Roux
sumber
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'
Ray Koren
sumber
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;
BaffledBill
sumber
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'
Mohsen
sumber
1
select *  
  from dbo.sysobjects
 where xtype = 'P'
   and status > 0
Bob Probst
sumber
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;
LostCajun
sumber
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';
The_Coder
sumber
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'
Alexandru-Codrin Panaite
sumber
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
Reza Zendehboudi
sumber
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%'
HaveNoDisplayName
sumber
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')
Chandan Ravandur N
sumber
0
USE DBNAME

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


GO 

Ini akan bekerja pada mssql.

pengguna1556937
sumber
0

Pilih daftar prosedur tersimpan di SQL server. Lihat di sini untuk lebih lanjut: https://coderrooms.blogspot.com/2017/06/select-list-of-stored-procedure-in-sql.html

Ankur Tiwari
sumber
1
Halo dan selamat datang. Kode ini tampaknya tidak melakukan apa yang disarankan judul. Tampaknya hanya membuat prosedur tersimpan yang mengembalikan daftar catatan dari PaymentDetailstabel. OP menginginkan daftar prosedur tersimpan yang sebenarnya.
Jeremy Caney