ฉันจะค้นหาโพรซีเดอร์ที่เก็บที่มี <text> ได้อย่างไร?


คำตอบ:


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
ระวังการถูกตัดเป็นประจำที่ 4000 ตัวอักษรในกรณีที่คุณมีขั้นตอนที่ยาว ใช้วิธีการ OBJECTPROPERTY แทน
PeteT

1
ตามแผนการดำเนินการรูปแบบที่สามดูเหมือนจะเป็นวิธีที่มีประสิทธิภาพมากที่สุดในการรับข้อมูลนี้
TMcManemy

1
ล้านครั้งที่ @PeteT พูด จำนวนอักขระสูงสุด 4000 ตัวนี้กัดฉันไม่กี่ปีที่ผ่านมา
Vivian River

14
คุณสามารถเพิ่มคำอธิบายว่าแบบสอบถาม 3 ข้อแต่ละข้อทำอะไรได้บ้างและแตกต่างกันอย่างไร
Tot Zam

3
ยินดีที่จะมีรายละเอียดบางอย่างเกี่ยวกับสิ่งที่แต่ละแบบสอบถามทำอยู่และความแตกต่างของแบบสอบถามหรือสาเหตุที่ทำให้แบบสอบถามดีกว่า คำตอบประเภทนี้สนับสนุนการคัดลอก / วางโดยวิศวกรที่มีประสบการณ์น้อยกว่าและความยุ่งยากสำหรับวิศวกรอาวุโสที่ทำงานกับ RDBMS ใหม่เช่น SQL Server
DavidScherer

78

คว้าสำเนาของตัวเองได้ฟรี แดงประตู SQL ค้นหาเครื่องมือและเริ่มเพลิดเพลินกับการค้นหาใน SQL Server! :-)

ป้อนคำอธิบายรูปภาพที่นี่

มันเป็นเครื่องมือที่ยอดเยี่ยมและมีประโยชน์มากและใช่! มันฟรีทั้งหมดสำหรับการใช้งานทุกประเภท


5
นี่เป็นเครื่องมือที่ยอดเยี่ยมที่ฉันเคยใช้มาแล้วก่อนที่ฉันจะตอบคำถามนี้ เป็นที่น่าสังเกตว่าจะ จำกัด ผลการค้นหาไว้ที่ 150 โดยค่าเริ่มต้น ลองโพสต์ในฟอรัมนี้เพื่อดูข้อมูลเกี่ยวกับวิธีเพิ่มขีด จำกัด นั้น
สกอตต์

1
มันเป็นเครื่องมือที่เร็วและใช้งานได้
Suat Atan ปริญญาเอก

มีคุณสมบัติ จำกัด แต่เครื่องมือยอดเยี่ยม
Aishwarya Shiva


32

ฉันตอบคำถามของ Kashif และรวมทุกอย่างเข้าด้วยกัน น่าแปลกที่บางครั้งฉันพบผลลัพธ์ในตัวเลือกอย่างใดอย่างหนึ่ง แต่ไม่ใช่ผลลัพธ์ เพื่อความปลอดภัยฉันวิ่งทั้ง 3 เมื่อฉันมองหาบางอย่าง หวังว่านี่จะช่วย:

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

ในกรณีที่คุณต้องการสคีมาด้วย:

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
โปรดระวังด้วยเช่นนี้เนื่องจากเป็นเพียงการจับคู่สตริงย่อย "FieldName" อาจเกิดขึ้นในความคิดเห็นหรือค่าคงที่สตริงหรือสิ่งอื่น ๆ เช่นนั้น นอกจากนี้ฉันยังสงสัยว่าการค้นหา[whatever]นั้นจะจับได้whateverหรือไม่
CVn

2
ดูความคิดเห็นของ @ PeteT ในคำตอบที่ยอมรับด้านบน Information_SCHEMA.ROUTINES.ROUTINE_DEFINITION ถูกครอบตัดที่ 4000 อักขระ ดังนั้นวิธีนี้จะไม่ทำงานหากคุณมีขั้นตอนการจัดเก็บที่ยาวเกินกว่า 4,000 ตัวอักษร
TMcManemy

7

ฉันลองตัวอย่างด้านบน แต่มันไม่ได้แสดงมากกว่า 4,000 ตัวอักษรจากนั้นฉันแก้ไขมันเล็กน้อยและก็สามารถรับนิยามโพรซีเดอร์ที่เก็บไว้ทั้งหมดได้ โปรดดูสคริปต์ที่อัปเดตด้านล่าง -

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

ก่อนอื่นให้แน่ใจว่าคุณกำลังเรียกใช้แบบสอบถามภายใต้ข้อมูลรับรองผู้ใช้ของคุณและในบริบทฐานข้อมูลที่ถูกต้อง

USE YOUR_DATABASE_NAME;

มิฉะนั้น sys.procedures จะไม่ส่งคืนสิ่งใด ตอนนี้เรียกใช้แบบสอบถามดังต่อไปนี้:

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

อีกตัวเลือกหนึ่งคือการใช้ INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION แต่โปรดทราบว่ามีจำนวนอักขระที่ จำกัด (เช่นตัวอักษร 4000 ตัวแรก) ของรูทีนเท่านั้น

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

ฉันทดสอบกับ Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)



2

นี่คือรุ่นรวมที่ใช้ Losbear ทำ แต่แก้ไขเพื่อให้มันออกชื่อสกีมา:

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

วิธีการค้นหากระบวนงานที่เก็บไว้ประกอบด้วยข้อความหรือสายอักขระ

หลายครั้งที่เราจำเป็นต้องค้นหาข้อความหรือสตริงในขั้นตอนการจัดเก็บ นี่คือแบบสอบถามเพื่อค้นหาข้อความที่มี

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

สำหรับข้อมูลเพิ่มเติมโปรดตรวจสอบ URL ที่ให้ไว้ด้านล่าง

http://www.freshcodehub.com/Article/34/how-to-find-a-stored-procedure-containing-text-or-string


2

สำหรับเซิร์ฟเวอร์ SQL ที่ใหม่กว่าเซิร์ฟเวอร์ 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

หากมีใครบางคนติดอยู่กับเซิร์ฟเวอร์ SQL 2000 ตาราง sql_modules ไม่มีอยู่ดังนั้นคุณจะใช้ syscomments คุณจะได้รับหลายระเบียนสำหรับ procdedures ที่เก็บไว้ที่มีขนาดใหญ่กว่า 4,000 ตัวอักษร แต่พวกเขาจะมีฟิลด์c.numberเหมือนกันดังนั้นคุณจึงสามารถจัดกลุ่มได้ ชิ้นส่วนเข้าด้วยกันเพื่อรับข้อความขั้นตอนการจัดเก็บแบบเต็ม:

    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

แบบสอบถามนี้ส่งคืนชื่อและเนื้อหาของกระบวนงานที่เก็บไว้ใด ๆ ที่มีการอ้างอิง "XXXX" ภายในกระบวนงานที่เก็บไว้

นี่เป็นการเลิกใช้งานที่มีประโยชน์เมื่อค้นหาโพรซีเดอร์ที่อ้างอิงตาราง / มุมมอง / โพรซีเดอร์เฉพาะ


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

นี่คือสิ่งที่ฉันเขียนใน SQL 2012 เพื่อเลือกโพรซีเดอร์ที่เก็บไว้ทั้งหมดที่ชื่อเช่น "CompanySpecialisation"


0

ขั้นตอนการจัดเก็บเพื่อค้นหาข้อความใน SP {Dinesh Baskaran} Trendy Global Systems 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
sp_msforeachdb 'use ?;select name,''?'' from sys.procedures where object_definition(object_id) like ''%text%'''

สิ่งนี้จะค้นหาในขั้นตอนการจัดเก็บทั้งหมดของฐานข้อมูลทั้งหมด สิ่งนี้จะทำงานเป็นเวลานาน


0

ฉันใช้สคริปต์นี้ หากคุณเปลี่ยนความคิดเห็น XML ของคุณเพื่อแสดงเป็นข้อความสีดำบนพื้นหลังสีเหลืองคุณจะได้รับผลของการเน้นข้อความที่คุณต้องการในคอลัมน์ xml ของผลลัพธ์ (เครื่องมือ -> ตัวเลือก -> สภาพแวดล้อม -> แบบอักษรและสี [รายการแสดง: ความคิดเห็น 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     -----------------
    ---------------------------------------------
    ---------------------------------------------
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.