Truy vấn để liệt kê tất cả các thủ tục được lưu trữ


338

Truy vấn nào có thể trả về tên của tất cả các thủ tục được lưu trữ trong cơ sở dữ liệu SQL Server

Nếu truy vấn có thể loại trừ các thủ tục lưu trữ hệ thống, điều đó sẽ hữu ích hơn nữa.

Câu trả lời:


499

Như Mike đã nêu, cách tốt nhất là sử dụng information_schema. Miễn là bạn không ở trong cơ sở dữ liệu chủ, các thủ tục lưu trữ hệ thống sẽ không được trả về.

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

Nếu vì lý do nào đó bạn có các thủ tục được lưu trữ ngoài hệ thống trong cơ sở dữ liệu chính, bạn có thể sử dụng truy vấn (điều này sẽ lọc ra các thủ tục lưu trữ hệ thống MOST):

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

3
Nếu bạn tạo sơ đồ cơ sở dữ liệu, bạn có thể nhận được một loạt các procs bắt đầu bằng 'dt_' trong cơ sở dữ liệu của mình mà bạn cũng có thể lọc ra.
John Fouhy

+1 cho lược đồ thông tin. đáng để đọc: msdn.microsoft.com/en-us/l
Library / ms186778.aspx

Nó phải là "Miễn là bạn không ở trong cơ sở dữ liệu [chính] hoặc [msdb], ..."
Solomon Rutzky

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

4
Điều này làm việc cho tôi trong một môi trường chia sẻ trong MS-SQL 2008; hai lần trước không ...
Realto619

3
Bất cứ ai sử dụng SQL Server 2005 hoặc mới hơn nên tránh xa các dbo.sys*khung nhìn. Truy vấn này cũng: lọc ra các thủ tục được lưu trữ CLR, không lọc các procs được lưu trữ của hệ thống và trả về [type] khi biết rằng [type] sẽ luôn là 'P' vì đó là điều kiện WHERE.
Solomon Rutzky

nó sẽ không hoạt động nếu các đối tượng trong cơ sở dữ liệu có lược đồ khác
Foyzul Karim

30

Theo hiểu biết của tôi, phương pháp "ưa thích" là sử dụng các bảng information_schema:

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

các hồ sơ được trả lại dường như không có cách nào để phân biệt các thủ tục được lưu trữ trong hệ thống

18

Sau đây sẽ trả về tất cả các thủ tục trong cơ sở dữ liệu được chọn

SELECT * FROM sys.procedures

cái này đã được sửa đổi và tạo ngày, v.v ... rất hữu ích
ihightower

14

Bạn có thể thử truy vấn này để nhận các thủ tục và chức năng được lưu trữ:

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

Nếu bạn đang sử dụng SQL Server 2005, phần sau sẽ hoạt động:

select *
  from sys.procedures
 where is_ms_shipped = 0

điều này sẽ cho kết quả sai và bao gồm hệ thống như sơ đồ được lưu trữ thủ tục (sp_upgraddiagrams) trong sql 2008
HaveNoDisplayName 8/1/2015

@Piyush Đúng là nó sẽ trả về các procs sơ đồ, nhưng ai đó có thể không coi chúng là procs "hệ thống" vì chúng không đi kèm với bản cài đặt tiêu chuẩn. OP không chỉ định cách xử lý để không lọc chúng không nhất thiết là sai.
Solomon Rutzky

@srutzky: - nhưng vẫn không phải là sp được tạo bởi người dùng
HaveNoDisplayName

@Piyush Đúng, nhưng như tôi đã nói, OP không chỉ định cách xử lý các procs không phải là "người dùng tạo" hay "hệ thống". Và không ai hỏi cả.
Solomon Rutzky

Câu trả lời chính xác. Cảm ơn bạn đã bao gồm "is_ms_shipped = 0."
Hans Vonn

8

Bạn có thể sử dụng một trong các truy vấn dưới đây để tìm danh sách Thủ tục lưu trữ trong một cơ sở dữ liệu:

Truy vấn1:

    SELECT 
        *
    FROM sys.procedures;

Truy vấn2:

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

Nếu bạn muốn tìm danh sách tất cả các SP trong tất cả Cơ sở dữ liệu, bạn có thể sử dụng truy vấn bên dưới:

    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 ví dụ của bạn bằng cách sử dụng sp_msforeachdb là vàng và sẽ là câu trả lời. Đây là một liên kết tôi tìm thấy nói nhiều hơn về sproc này: weblogs.sqlteam.com/joew/archive/2008/08/27/60700.aspx
Mike Cheel

8

Chọn tất cả các thủ tục và lượt xem được lưu trữ

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

5

Điều này cũng có thể giúp liệt kê các thủ tục ngoại trừ các thủ tục hệ thống:

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

Không có lý do để sử dụng sys.all_objectsvì bạn đang lọc is_ms_shipped=0. Nó có thể chứa DDL Triggers, nhưng chúng sẽ được lọc ra type='p'. Bạn cũng có thể sử dụng sys.objects.
Solomon Rutzky

4

Thật không may INFORMATION_SCHEMA, không chứa thông tin về các procs hệ thống.

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

1
Tại sao bạn sẽ sử dụng điều này thay vì sys.procedures where is_ms_shipped = 0? Và tại sao bạn lại chạy một hàm objectproperty(object_id, N'IsMSShipped')cho mỗi hàng khi có một trường is_ms_shippedchứa giá trị đó? Dọc theo cùng một dòng, tại sao chạy lại chức năng đó khi [type] IN ('P', 'PC')làm điều tương tự? Phương pháp này phức tạp không cần thiết và không hiệu quả.
Solomon Rutzky

4

Chỉ tên

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

3

Tôi đã điều chỉnh bài đăng tuyệt vời của LostCajun ở trên để loại trừ các thủ tục lưu trữ hệ thống. Tôi cũng xóa "Trích xuất." từ mã bởi vì tôi không thể tìm ra nó để làm gì và nó đã cho tôi lỗi. Câu lệnh "tìm nạp tiếp theo" bên trong vòng lặp cũng cần một mệnh đề "vào".

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

cách tốt nhất để có được các đối tượng là sử dụng sys.sql_modules. bạn có thể tìm thấy mọi thứ bạn muốn từ bảng này và nối bảng này với bảng khác để có thêm thông tin của 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

trạng thái> 0 dường như không phân biệt giữa các quy trình được lưu trữ hệ thống và các quy trình được tạo

Hừm. Nó làm cho chúng tôi - tôi không biết tại sao.
Bob Probst

Bất cứ ai sử dụng SQL Server 2005 hoặc mới hơn nên tránh xa các dbo.sys*khung nhìn. Truy vấn này cũng lọc ra các thủ tục lưu sẵn CLR.
Solomon Rutzky

1

Tôi đã viết tsql đơn giản này để liệt kê văn bản của tất cả các thủ tục được lưu trữ. Hãy chắc chắn để thay thế tên cơ sở dữ liệu của bạn trong trường.

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;

vui lòng xem phần viết lại của @BaffledBill về điều này .. đã làm việc cho tôi. Điều này đã không làm việc vì nó có rất nhiều lỗi.
ihightower

1

Điều này sẽ chỉ cung cấp tên của các thủ tục được lưu trữ.

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

1

Điều này sẽ hiển thị tất cả các thủ tục được lưu trữ và mã:

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

Cái này, liệt kê tất cả những thứ bạn muốn

Trong máy chủ Sql 2005, 2008, 2012:

Use [YourDataBase]

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

HOẶC LÀ

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

Không có lý do để sử dụng, hoặc lợi ích từ việc sử dụng , sp_tables. Ngoài ra, "THỦ TỤC" không phải là một lựa chọn hợp lệ cho sp_tables. Các tùy chọn duy nhất cho @table_typelà: 'BẢNG HỆ THỐNG', 'BẢNG' và 'XEM'.
Solomon Rutzky

0

Điều này sẽ trả về tất cả tên sp

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

Điều kiện trên [type]nên là [type] IN ('P', 'PC')bạn đang lọc ra bất kỳ procs lưu trữ CLR nào có khả năng ở đó.
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 

Điều này sẽ làm việc trên mssql.


0

Chọn danh sách các thủ tục được lưu trữ trong máy chủ SQL. Tham khảo tại đây để biết thêm: https://coderrooms.blogspot.com/2017/06/select-list-of-stored-procedure-in-sql.html


1
Xin chào và chào mừng. Mã này không xuất hiện để làm những gì tiêu đề gợi ý. Dường như chỉ cần tạo một thủ tục được lưu trữ sẽ trả về một danh sách các bản ghi từ một PaymentDetailsbảng. OP muốn có một danh sách các thủ tục lưu trữ thực tế.
Jeremy Caney
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.