Tìm thủ tục được lưu trữ theo tên


83

Có cách nào tôi có thể tìm thấy thủ tục được lưu trữ trong SQL Server Management Studio theo tên hoặc một phần của tên không? (trên ngữ cảnh cơ sở dữ liệu đang hoạt động)

Cảm ơn vì sự giúp đỡ

Câu trả lời:


141

Bạn có thể dùng:

select * 
from 
   sys.procedures 
where 
   name like '%name_of_proc%'

nếu bạn cần mã, bạn có thể xem trong bảng syscomments

select text 
from 
    syscomments c
    inner join sys.procedures p on p.object_id = c.object_id
where 
    p.name like '%name_of_proc%'

Chỉnh sửa Cập nhật:

bạn cũng có thể sử dụng phiên bản tiêu chuẩn ansi

SELECT * 
FROM 
    INFORMATION_SCHEMA.ROUTINES 
WHERE 
    ROUTINE_NAME LIKE '%name_of_proc%'

1
Nếu bạn muốn nhận văn bản của sp có tên, thì việc sử dụng "sp_helptext SPNAME" sẽ dễ dàng hơn
Harry Sarshogh

2
Sql 2012, đã phải làm inner join sys.procedures p on p.object_id = c.idthay
user5226582

1
Lưu ý đối với SQL Server, phiên bản tiêu chuẩn ANSI cắt ROUTINE_DEFINITION ở 8k. Bạn có thể sử dụng object_definition(object_id(r.ROUTINE_NAME)),thay thế nó là một vấn đề.
Mark Schultheiss

+1 cho phiên bản tiêu chuẩn ANSI trả về danh mục (cơ sở dữ liệu) và lược đồ trong trường hợp bạn không chắc chắn thủ tục nằm ở đâu. (Ví dụ: tôi thấy một công việc Đại lý tham chiếu đến một thủ tục mà tôi không thể dễ dàng tìm thấy; truy vấn tiêu chuẩn ANSI đã giải quyết vấn đề này cho tôi).
youcantryreachingme

42

Giả sử bạn đang ở trong Object Explorer Details ( F7) hiển thị danh sách các Thủ tục được Lưu trữ, hãy nhấp vào nút Bộ lọc và nhập tên (hoặc một phần tên).

văn bản thay thế


2
Cảm ơn bạn rất nhiều, tôi không biết về bộ lọc bằng cách nào đó tôi không bao giờ nhìn thấy nút đó.
Chad Portman

5

Điều này cũng sẽ hoạt động đối với các bảng và chế độ xem (trong số những thứ khác), không chỉ các mầm:

SELECT
    '[' + s.name + '].[' + o.Name + ']',
    o.type_desc
FROM
    sys.objects o
    JOIN sys.schemas s ON s.schema_id = o.schema_id
WHERE
    o.name = 'CreateAllTheThings' -- if you are certain of the exact name
    OR o.name LIKE '%CreateAllThe%' -- if you are not so certain

Nó cũng cung cấp cho bạn tên lược đồ sẽ hữu ích trong bất kỳ cơ sở dữ liệu không tầm thường nào (ví dụ: cơ sở dữ liệu mà bạn cần truy vấn để tìm một thủ tục được lưu trữ theo tên).


1
Di chuyển một ứng dụng cũ từ sql 2005 sang 2016 tập lệnh của tôi có 'cú pháp không chính xác gần' @errorMessage ', điều này không hữu ích lắm. Khi tôi chạy cùng một sql trong SSSM, nó đã thêm "trong thủ tục 'some_name'", nhưng không có thủ tục nào được lưu trữ như vậy ở bất kỳ đâu! Hóa ra đó là một yếu tố kích hoạt và truy vấn của bạn đã tìm thấy nó. Cảm ơn!
MickeyfAgain_BeforeExitOfSO

1

Bạn có thể sử dụng truy vấn này:

SELECT 
    ROUTINE_CATALOG AS DatabaseName ,
    ROUTINE_SCHEMA AS SchemaName,
    SPECIFIC_NAME AS SPName ,
    ROUTINE_DEFINITION AS SPBody ,
    CREATED AS CreatedDate,
    LAST_ALTERED AS LastModificationDate
FROM INFORMATION_SCHEMA.ROUTINES
WHERE 
    (ROUTINE_DEFINITION LIKE '%%')
    AND 
    (ROUTINE_TYPE='PROCEDURE')
    AND
    (SPECIFIC_NAME LIKE '%AssessmentToolDegreeDel')

Như bạn thấy, bạn cũng có thể thực hiện tìm kiếm bên trong phần thân của Stored Procedure.


0

Một mẹo rất nhỏ mà tôi tình cờ gặp phải khi thử một số SQL injection, trong trình khám phá đối tượng trong hộp tìm kiếm, chỉ cần sử dụng các ký tự phần trăm của bạn và điều này sẽ tìm kiếm MỌI THỨ các thủ tục, hàm, chế độ xem, bảng, lược đồ, chỉ mục được lưu trữ ... Tôi mệt mỏi khi nghĩ thêm :)

Dạng tìm kiếm


0

Khi tôi có tên Thủ tục lưu trữ và không biết nó thuộc về cơ sở dữ liệu nào, tôi sử dụng như sau:

Use [master]
GO

DECLARE @dbname VARCHAR(50)   
DECLARE @statement NVARCHAR(max)

DECLARE db_cursor CURSOR 
LOCAL FAST_FORWARD
FOR  
--Status 48 (mirrored db)
SELECT name FROM MASTER.dbo.sysdatabases WHERE STATUS NOT LIKE 48 AND name NOT IN ('master','model','msdb','tempdb','distribution')  

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @dbname  
WHILE @@FETCH_STATUS = 0  
BEGIN  

SELECT @statement = 'SELECT * FROM ['+@dbname+'].INFORMATION_SCHEMA.ROUTINES  WHERE [ROUTINE_NAME] LIKE ''%name_of_proc%'''+';'
print @statement

EXEC sp_executesql @statement

FETCH NEXT FROM db_cursor INTO @dbname  
END  
CLOSE db_cursor  
DEALLOCATE db_cursor

0

Đối với SQL Server phiên bản 9.0 (2005), bạn có thể sử dụng mã bên dưới:

select * 
from 
syscomments c
inner join sys.procedures p on p.object_id = c.id
where 
p.name like '%usp_ConnectionsCount%';

0

Tùy chọn 1: Trong SSMS, truy cập View > Object Explorer Detailshoặc nhấn F7. Sử dụng Searchhộp. Cuối cùng trong danh sách hiển thị nhấp chuột phải và chọn Synchronizeđể tìm đối tượng trong Object Explorercây.

Chi tiết Trình khám phá Đối tượng

Tùy chọn 2: Cài đặt Tiện ích bổ sung giống như dbForge Search. Nhấp chuột phải vào danh sách hiển thị và chọn Find in Object Explorer.

nhập mô tả hình ảnh ở đây

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.