Làm cách nào để tìm một thủ tục được lưu trữ có chứa <text>?


Câu trả lời:


557
SELECT ROUTINE_NAME, ROUTINE_DEFINITION
    FROM INFORMATION_SCHEMA.ROUTINES 
    WHERE ROUTINE_DEFINITION LIKE '%Foo%' 
    AND ROUTINE_TYPE='PROCEDURE'

SELECT OBJECT_NAME(id) 
    FROM SYSCOMMENTS 
    WHERE [text] LIKE '%Foo%' 
    AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
    GROUP BY OBJECT_NAME(id)

SELECT OBJECT_NAME(object_id)
    FROM sys.sql_modules
    WHERE OBJECTPROPERTY(object_id, 'IsProcedure') = 1
    AND definition LIKE '%Foo%'

61
Hãy lưu ý thường xuyên định nghĩa được cắt ở 4000 ký tự trong trường hợp bạn có một thủ tục dài. Sử dụng phương pháp MỤC TIÊU thay thế.
PeteT

1
Theo kế hoạch thực hiện, biến thể thứ ba dường như là cách hiệu quả nhất để có được dữ liệu này.
TMcManemy

1
Một triệu lần những gì @PeteT đã nói. Giới hạn 4000 ký tự này thực sự cắn tôi vài năm trước.
Sông Vivian

14
Bạn có thể thêm một số giải thích về những gì trong số 3 truy vấn này không, và sự khác biệt giữa chúng là gì?
Tot Zam

3
Sẽ rất tuyệt nếu có một số chi tiết về những gì mỗi truy vấn đang thực hiện và chúng khác nhau như thế nào hoặc tại sao một truy vấn tốt hơn một truy vấn khác. Những loại câu trả lời này khuyến khích mù / sao chép bởi các kỹ sư ít kinh nghiệm hơn và gây thất vọng cho các kỹ sư cao cấp hơn làm việc với RDBMS mới như SQL Server.
DavidScherer

78

Lấy cho mình một bản sao của công cụ Tìm kiếm SQL Cổng đỏ miễn phí và bắt đầu thưởng thức tìm kiếm trong SQL Server! :-)

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

Đây là một công cụ tuyệt vời và rất hữu ích, và CÓ! nó hoàn toàn, hoàn toàn MIỄN PHÍ cho bất kỳ loại sử dụng nào.


5
Đây là một công cụ tuyệt vời, mà tôi đã sử dụng trước khi tôi gặp câu hỏi này. Điều đáng chú ý là nó giới hạn kết quả tìm kiếm ở mức 150 theo mặc định. Kiểm tra bài đăng diễn đàn này để biết thông tin về cách tăng giới hạn đó.
Scott

1
Nó là công cụ siêu nhanh và có thể sử dụng.
Suat Atan Tiến sĩ

Tính năng hạn chế nhưng công cụ tuyệt vời.
Aishwarya Shiva


32

Tôi lấy câu trả lời của Kashif và kết hợp tất cả chúng lại với nhau. Thật kỳ lạ, đôi khi, tôi tìm thấy kết quả ở một trong những lựa chọn nhưng không phải là kết quả khác. Vì vậy, để an toàn, tôi chạy cả 3 khi tôi đang tìm kiếm thứ gì đó. Hi vọng điêu nay co ich:

DECLARE @SearchText varchar(1000) = 'mytext';

SELECT DISTINCT SPName 
FROM (
    (SELECT ROUTINE_NAME SPName
        FROM INFORMATION_SCHEMA.ROUTINES 
        WHERE ROUTINE_DEFINITION LIKE '%' + @SearchText + '%' 
        AND ROUTINE_TYPE='PROCEDURE')
    UNION ALL
    (SELECT OBJECT_NAME(id) SPName
        FROM SYSCOMMENTS 
        WHERE [text] LIKE '%' + @SearchText + '%' 
        AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
        GROUP BY OBJECT_NAME(id))
    UNION ALL
    (SELECT OBJECT_NAME(object_id) SPName
        FROM sys.sql_modules
        WHERE OBJECTPROPERTY(object_id, 'IsProcedure') = 1
        AND definition LIKE '%' + @SearchText + '%')
) AS T
ORDER BY T.SPName

12

Trong trường hợp bạn cũng cần lược đồ:

SELECT   DISTINCT SCHEMA_NAME(o.schema_id),o.name,[text]
FROM     syscomments AS c
         INNER JOIN sys.objects AS o ON c.id = o.[object_id]
         INNER JOIN sys.schemas AS s ON o.schema_id = s.schema_id
WHERE    text LIKE '%foo%'
ORDER BY  SCHEMA_NAME(o.schema_id),o.name 

10
SELECT ROUTINE_NAME, ROUTINE_DEFINITION 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%FieldName%' 
AND ROUTINE_TYPE='PROCEDURE'

2
Tuy nhiên, hãy cẩn thận với điều này, vì nó chỉ là một chuỗi con phù hợp. "FieldName" có thể xảy ra trong một nhận xét hoặc hằng chuỗi hoặc bất cứ điều gì tương tự. Ngoài ra, tôi nghi ngờ việc tìm kiếm [whatever]sẽ bắt whatever(trở nên quan trọng hơn khi bạn đang tìm kiếm các định danh đủ điều kiện lược đồ).
một CVn

2
Xem bình luận của @ PeteT trong câu trả lời được chấp nhận ở trên. THÔNG TIN_SCHema.ROUTINES.ROUTINE_DEFINITION được cắt ở 4000 ký tự. Như vậy, phương pháp này sẽ không hoạt động nếu bạn có các thủ tục lưu trữ dài hơn 4000 ký tự.
TMcManemy

7

Tôi đã thử ví dụ trên nhưng nó không hiển thị hơn 4000 ký tự sau đó tôi đã sửa đổi nó một chút và có thể lấy toàn bộ định nghĩa thủ tục được lưu trữ. Vui lòng xem tập lệnh được cập nhật bên dưới -

SELECT SCHEMA_NAME(O.SCHEMA_ID) [SCHEMA_NAME], O.NAME, OBJECT_DEFINITION(OBJECT_ID) TEXT
FROM   SYSCOMMENTS AS C
       INNER JOIN SYS.OBJECTS AS O ON C.ID = O.[OBJECT_ID]
       INNER JOIN SYS.SCHEMAS AS S ON O.SCHEMA_ID = S.SCHEMA_ID
WHERE  OBJECT_DEFINITION(OBJECT_ID) LIKE '%FOO%'
ORDER BY  SCHEMA_NAME(O.SCHEMA_ID), O.NAME

6

Trước tiên, đảm bảo rằng bạn đang chạy truy vấn theo thông tin đăng nhập của người dùng và trong bối cảnh cơ sở dữ liệu phù hợp.

USE YOUR_DATABASE_NAME;

Nếu không, sys.procedures sẽ không trả lại bất cứ điều gì. Bây giờ hãy chạy truy vấn như dưới đây:

select * from sys.procedures p 
join sys.syscomments s on p.object_id = s.id 
where text like '%YOUR_TEXT%';

Một tùy chọn khác là sử dụng Information_SCHema.ROUTINES.ROUTINE_DEFINITION, nhưng lưu ý rằng nó chỉ chứa số lượng ký tự giới hạn (nghĩa là 4000 ký tự đầu tiên) của thường trình.

select * from YOUR_DATABASE_NAME.INFORMATION_SCHEMA.ROUTINES
where ROUTINE_DEFINITION like '%YOUR_TEXT%';

Tôi đã thử nghiệm trên Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)



2

Đây là phiên bản hợp nhất sử dụng Losbear, nhưng đã sửa đổi để nó cũng xuất ra tên lược đồ:

DECLARE @SearchText varchar(1000) = 'searchtext';

SELECT DISTINCT sc.SPECIFIC_SCHEMA as 'Schema', sp.SPName as 'Name'
FROM (
    (SELECT ROUTINE_NAME SPName
        FROM INFORMATION_SCHEMA.ROUTINES 
        WHERE ROUTINE_DEFINITION LIKE '%' + @SearchText + '%' 
        AND ROUTINE_TYPE='PROCEDURE')
    UNION ALL
    (SELECT OBJECT_NAME(id) SPName
        FROM SYSCOMMENTS 
        WHERE [text] LIKE '%' + @SearchText + '%' 
        AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
        GROUP BY OBJECT_NAME(id))
    UNION ALL
    (SELECT OBJECT_NAME(object_id) SPName
        FROM sys.sql_modules
        WHERE OBJECTPROPERTY(object_id, 'IsProcedure') = 1
        AND definition LIKE '%' + @SearchText + '%')
) AS sp
CROSS APPLY (select SPECIFIC_SCHEMA from INFORMATION_SCHEMA.ROUTINES r where r.ROUTINE_NAME = sp.SPName) sc
ORDER BY 1

2

Làm thế nào để tìm một thủ tục lưu trữ có chứa văn bản hoặc chuỗi

Nhiều lần chúng ta cần tìm văn bản hoặc chuỗi trong thủ tục được lưu trữ. Đây là truy vấn để tìm văn bản chứa.

SELECT OBJECT_NAME(id) 
FROM SYSCOMMENTS 
WHERE [text] LIKE '%Text%' 
AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
GROUP BY OBJECT_NAME(id)

Để biết thêm thông tin xin vui lòng kiểm tra URL được cung cấp dưới đây.

http://www.freshcodehub.com/Article/34/how-to-find-a-stored-procedure-contained-text-or- chuỗi


2

Đối với bất kỳ máy chủ SQL nào mới hơn máy chủ SQL 2000:

SELECT object_name = OBJECT_NAME(sm.object_id), o.type_desc, sm.definition  
FROM sys.sql_modules AS sm  
JOIN sys.objects AS o ON sm.object_id = o.object_id  
WHERE sm.definition like '%searchString%'  
ORDER BY  o.type, o.name, o.object_id

Nếu ai đó bị mắc kẹt với máy chủ SQL 2000, bảng sql_modules không tồn tại, do đó bạn sẽ sử dụng syscomments, bạn sẽ nhận được nhiều bản ghi cho các gói được lưu trữ lớn hơn 4000 ký tự, nhưng chúng sẽ có cùng một trường c.number để bạn có thể nhóm các phần với nhau để có được văn bản thủ tục được lưu trữ đầy đủ:

    Select o.id, c.number, o.name, c.text  
    from syscomments c 
    inner join sysobjects o on o.id = c.id 
    where c.encrypted = 0 and o.type = 'P'  
      and c.id in  
     (Select id from syscomments where text like '%searchtext%')
    order by objecttype, o.name, o.id, c.number, c.colid        


1
create Procedure [dbo].[TextFinder]
(@Text varchar(500),@Type varchar(2)=NULL) 
AS
BEGIN



SELECT DISTINCT o.name AS ObjectName,
CASE o.xtype

WHEN 'C' THEN 'CHECK constraint'

WHEN 'D' THEN 'Default or DEFAULT constraint'

WHEN 'F' THEN 'FOREIGN KEY constraint'

WHEN 'FN' THEN 'Scalar function'

WHEN 'IF' THEN 'In-lined table-function'

WHEN 'K' THEN 'PRIMARY KEY or UNIQUE constraint'

WHEN 'L' THEN 'Log'

WHEN 'P' THEN 'Stored procedure'

WHEN 'R' THEN 'Rule'

WHEN 'RF' THEN 'Replication filter stored procedure'

WHEN 'S' THEN 'System table'

WHEN 'TF' THEN 'Table function'

WHEN 'TR' THEN 'Trigger'`enter code here`

WHEN 'U' THEN 'User table'

WHEN 'V' THEN 'View'

WHEN 'X' THEN 'Extended stored procedure'

ELSE o.xtype

END AS ObjectType,

ISNULL( p.Name, '[db]') AS Location

FROM syscomments c

INNER JOIN sysobjects o ON c.id=o.id

LEFT JOIN sysobjects p ON o.Parent_obj=p.id

WHERE c.text LIKE '%' + @Text + '%' and

o.xtype = case when @Type IS NULL then o.xtype  else @Type end

ORDER BY Location, ObjectName

END

0
SELECT s.name + '.' + o.name ProcedureName
, c.text ProcedureSteps
FROM   sys.syscomments c 
INNER JOIN
sys.objects o 
ON 
c.id = o.object_id
INNER JOIN
sys.schemas s 
ON 
o.schema_id = s.schema_id
WHERE  o.type = 'P'
AND c.text LIKE N'%XXXX%'
ORDER BY s.name + '.' + o.name
, c.colid

Truy vấn này trả về tên và nội dung của bất kỳ thủ tục được lưu trữ nào trong đó "XXXX" được tham chiếu trong quy trình được lưu trữ.

Điều này được bỏ qua rất hữu ích khi tìm các thủ tục tham chiếu một bảng / khung nhìn / thủ tục cụ thể


0
SELECT * FROM sys.procedures WHERE Name LIKE '%CompanySpecialisation%'

Đây là những gì tôi đã viết trong SQL 2012 để chọn tất cả các thủ tục được lưu trữ có tên như "Company Specialisation"


0

Thủ tục lưu trữ để tìm văn bản trong SP .. {Dinesh Baskaran} Hệ thống toàn cầu hợp thời trang pvt ltd

  create Procedure [dbo].[TextFinder]
 (@Text varchar(500),@Type varchar(2)=NULL)
AS
BEGIN





SELECT DISTINCT o.name AS ObjectName, 
CASE o.xtype 
WHEN 'C' THEN 'CHECK constraint ' 
WHEN 'D' THEN 'Default or DEFAULT constraint'
WHEN 'F' THEN 'FOREIGN KEY constraint'
WHEN 'FN' THEN 'Scalar function'
WHEN 'IF' THEN 'In-lined table-function'
WHEN 'K' THEN 'PRIMARY KEY or UNIQUE constraint'
WHEN 'L' THEN 'Log'
WHEN 'P' THEN 'Stored procedure'
WHEN 'R' THEN 'Rule'
WHEN 'RF' THEN 'Replication filter stored procedure' 
WHEN 'S' THEN 'System table'  
WHEN 'TF' THEN 'Table function' 
WHEN 'TR' THEN 'Trigger'  
WHEN 'U' THEN 'User table' 
WHEN 'V' THEN 'View' 
WHEN 'X' THEN 'Extended stored procedure' 
ELSE o.xtype 
END AS ObjectType,  

ISNULL( p.Name, '[db]') AS Location

FROM syscomments c

INNER JOIN sysobjects o ON c.id=o.id

LEFT JOIN sysobjects p ON o.Parent_obj=p.id

WHERE c.text LIKE '%' + @Text + '%' and

o.xtype = case when @Type IS NULL then o.xtype  else @Type end 


ORDER BY Location, ObjectName



END

0
SELECT OBJECT_NAME(id)     
FROM syscomments 
WHERE [text] LIKE '%Name%' 
AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
GROUP BY OBJECT_NAME(id)

Thử cái này .....


0
sp_msforeachdb 'use ?;select name,''?'' from sys.procedures where object_definition(object_id) like ''%text%'''

Điều này sẽ tìm kiếm trong tất cả các thủ tục lưu trữ của tất cả các cơ sở dữ liệu. Điều này cũng sẽ làm việc cho các thủ tục dài.


0

Tôi sử dụng kịch bản này. Nếu bạn thay đổi Nhận xét XML của mình để hiển thị dưới dạng văn bản màu đen trên nền màu vàng, bạn sẽ có được hiệu ứng làm nổi bật văn bản bạn đang tìm kiếm trong cột xml của kết quả. (Công cụ -> Tùy chọn -> Môi trường -> Phông chữ và Màu sắc [Mục hiển thị: Nhận xét XML]

    ---------------------------------------------
    --------------   Start  FINDTEXT   ----------
    ---------------------------------------------

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
    SET NOCOUNT ON
    GO
    DECLARE @SearchString VARCHAR(MAX) 
    SET @SearchString = 'the text you''re looking for'
    DECLARE @OverrideSearchStringWith VARCHAR(MAX) 
    --#############################################################################
    -- Use Escape chars in Brackets []  like [%] to find percent char.
    --############################################################################# 

    DECLARE @ReturnLen INT 
    SET @ReturnLen = 50;
    with    lastrun
              as (select    DEPS.OBJECT_ID
                           ,MAX(last_execution_time) as LastRun
                  from      sys.dm_exec_procedure_stats DEPS
                  group by  deps.object_id
                 )
        SELECT  OL.Type
               ,OBJECT_NAME(OL.Obj_ID) AS 'Name'
               ,LTRIM(RTRIM(REPLACE(SUBSTRING(REPLACE(OBJECT_DEFINITION(OL.Obj_ID), NCHAR(0x001F), ''), CHARINDEX(@SearchString, OBJECT_DEFINITION(OL.Obj_ID)) - @ReturnLen, @ReturnLen * 2), @SearchString, '   ***-->>' + @SearchString + '<<--***  '))) AS SourceLine
               ,CAST(REPLACE(REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(MAX), REPLACE(OBJECT_DEFINITION(OL.Obj_ID), NCHAR(0x001F), '')), '&', '(A M P)'), '<', '(L T)'), '>', '(G T)'), @SearchString, '<!-->' + @SearchString + '<-->') AS XML) AS 'Hilight Search'
               ,(SELECT [processing-instruction(A)] = REPLACE(OBJECT_DEFINITION(OL.Obj_ID), NCHAR(0x001F), '')
                FOR
                 XML PATH('')
                    ,TYPE
                ) AS 'code'
               ,Modded AS Modified
               ,LastRun as LastRun
        FROM    (SELECT CASE P.type
                          WHEN 'P' THEN 'Proc'
                          WHEN 'V' THEN 'View'
                          WHEN 'TR' THEN 'Trig'
                          ELSE 'Func'
                        END AS 'Type'
                       ,P.OBJECT_ID AS OBJ_id
                       ,P.modify_Date AS modded
                       ,LastRun.LastRun
                 FROM   sys.Objects P WITH (NOLOCK)
                        LEFT join lastrun on P.object_id = lastrun.object_id
                 WHERE  OBJECT_DEFINITION(p.OBJECT_ID) LIKE '%' + @SearchString + '%'
                        AND type IN ('P', 'V', 'TR', 'FN', 'IF', 'TF')
                     --   AND lastrun.LastRun  IS NOT null
                ) OL
    OPTION  (FAST 10)

    ---------------------------------------------
    ----------------    END     -----------------
    ---------------------------------------------
    ---------------------------------------------
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.