Bagaimana cara menemukan prosedur tersimpan yang mengandung <text>?


Jawaban:


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
Sadarilah rutin_definisi dipangkas pada 4000 karakter jika Anda memiliki prosedur yang panjang. Gunakan metode OBJECTPROPERTY sebagai gantinya.
PeteT

1
Per rencana eksekusi, variasi ketiga tampaknya menjadi cara paling berkinerja untuk mendapatkan data ini.
TMcManemy

1
Jutaan kali apa yang dikatakan @PeteT. Batas 4000 karakter ini benar-benar menggigit saya beberapa tahun yang lalu.
Sungai Vivian

14
Bisakah Anda menambahkan beberapa penjelasan tentang apa yang masing-masing dilakukan dari 3 pertanyaan, dan apa perbedaan di antara mereka?
Tot Zam

3
Akan menyenangkan untuk memiliki beberapa perincian tentang apa yang dilakukan setiap kueri dan bagaimana mereka berbeda atau mengapa satu lebih baik dari yang lain. Jawaban semacam ini mendorong blind / copy paste oleh insinyur yang kurang berpengalaman, dan frustrasi untuk insinyur yang lebih senior yang bekerja dengan RDBMS baru seperti SQL Server.
DavidScherer

78

Ambil sendiri salinan bebas Red-Gate SQL Cari alat dan mulai menikmati pencarian di SQL Server! :-)

masukkan deskripsi gambar di sini

Ini alat yang hebat dan sangat berguna, dan YA! ini benar-benar GRATIS untuk segala jenis penggunaan.


5
Ini adalah alat yang sangat baik, yang sudah saya gunakan sebelum saya menemukan pertanyaan ini. Perlu dicatat bahwa ini membatasi hasil pencarian hingga 150 secara default. Lihat posting forum ini untuk info tentang cara meningkatkan batas itu.
Scott

1
Ini adalah alat yang sangat cepat dan dapat digunakan.
Suat Atan PhD

Fitur terbatas tetapi alat yang luar biasa.
Aishwarya Shiva


32

Saya mengambil jawaban Kashif dan menyatukan mereka semua bersama. Anehnya, kadang-kadang, saya menemukan hasil di salah satu pilihan tetapi tidak yang lain. Jadi agar aman, saya menjalankan semua 3 ketika saya sedang mencari sesuatu. Semoga ini membantu:

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

Jika Anda membutuhkan skema juga:

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
Berhati-hatilah dengan ini, karena ini hanya kecocokan substring. "FieldName" dapat muncul dalam komentar, atau string konstan, atau semacamnya. Juga, saya ragu mencari [whatever]akan menangkap whatever(menjadi lebih penting ketika Anda mencari pengidentifikasi yang memenuhi syarat skema).
CVn

2
Lihat komentar @ PeteT di jawaban yang diterima, di atas. INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION dipotong pada 4000 karakter. Dengan demikian, metode ini tidak akan berfungsi jika Anda memiliki prosedur tersimpan lebih dari 4000 karakter.
TMcManemy

7

Saya mencoba contoh di atas tetapi tidak menunjukkan lebih dari 4000 karakter kemudian saya memodifikasinya sedikit dan bisa mendapatkan seluruh definisi prosedur tersimpan. Silakan lihat skrip yang diperbarui di bawah ini -

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

Pertama pastikan bahwa Anda menjalankan kueri di bawah kredensial pengguna Anda, dan juga dalam konteks basis data yang tepat.

USE YOUR_DATABASE_NAME;

Jika tidak, prosedur sys.proses tidak akan mengembalikan apa pun. Sekarang jalankan query seperti di bawah ini:

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

Opsi lain adalah dengan menggunakan INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION, tetapi perlu diketahui bahwa itu hanya menampung sejumlah karakter (yaitu, 4000 karakter pertama) dari rutin.

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

Saya menguji pada Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)



2

Berikut adalah versi gabungan yang menggunakan Losbear dibuat, tetapi dimodifikasi sehingga juga menampilkan nama skema:

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

Cara Menemukan Prosedur Tersimpan yang Mengandung Teks atau String

Banyak waktu kita perlu menemukan teks atau string dalam prosedur tersimpan. Berikut ini pertanyaan untuk menemukan teks yang mengandung.

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

Untuk informasi lebih lanjut silakan periksa URL yang diberikan di bawah ini.

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


2

Untuk server SQL yang lebih baru dari SQL server 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

Jika seseorang terjebak dengan SQL server 2000, tabel sql_modules tidak ada, jadi Anda akan menggunakan syscomments, Anda akan mendapatkan beberapa catatan untuk procdedures tersimpan lebih dari 4000 karakter, tetapi mereka akan memiliki bidang c.number yang sama sehingga Anda dapat mengelompokkan bagian bersama-sama untuk mendapatkan teks prosedur tersimpan penuh:

    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

Kueri ini mengembalikan nama dan konten dari setiap prosedur tersimpan di mana "XXXX" direferensikan dalam prosedur tersimpan.

Ini tidak lagi berguna ketika menemukan prosedur yang merujuk pada tabel / tampilan / prosedur tertentu


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

Ini adalah apa yang saya tulis dalam SQL 2012 untuk memilih semua prosedur tersimpan di mana nama seperti "CompanySpecialisation"


0

Disimpan Prosedur untuk menemukan teks dalam 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
SELECT OBJECT_NAME(id)     
FROM syscomments 
WHERE [text] LIKE '%Name%' 
AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
GROUP BY OBJECT_NAME(id)

Coba ini .....


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

Ini akan mencari di semua prosedur tersimpan semua database. Ini juga akan bekerja untuk prosedur panjang.


0

Saya menggunakan skrip ini. Jika Anda mengubah Komentar XML Anda untuk ditampilkan sebagai teks hitam pada latar belakang kuning Anda mendapatkan efek menyorot teks yang Anda cari di kolom xml hasil. (Alat -> Opsi -> Lingkungan -> Fon dan Warna [Tampilkan item: XML Comment]

    ---------------------------------------------
    --------------   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     -----------------
    ---------------------------------------------
    ---------------------------------------------
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.