Cari teks dalam prosedur tersimpan di SQL Server


820

Saya ingin mencari teks dari semua prosedur tersimpan di basis data saya. Saya menggunakan SQL di bawah ini:

SELECT DISTINCT
       o.name AS Object_Name,
       o.type_desc
  FROM sys.sql_modules m
       INNER JOIN
       sys.objects o
         ON m.object_id = o.object_id
 WHERE m.definition Like '%[ABD]%';

Saya ingin mencari [ABD]di semua prosedur tersimpan termasuk tanda kurung, tetapi tidak memberikan hasil yang tepat. Bagaimana saya bisa mengubah permintaan saya untuk mencapai ini?

Jawaban:


570

Lepaskan kurung siku:

...
WHERE m.definition Like '%\[ABD\]%' ESCAPE '\'

Kemudian tanda kurung akan diperlakukan sebagai string literal bukan sebagai kartu liar.


jangan beri nama skema :(
Imad

4
@Imad Anda bisa mendapatkan nama skema dengan menambahkan SCHEMA_NAME(o.schema_id) AS Schema_Nameke klausa pilih.
patricus

6
Ini tidak bekerja dengan prosedur yang tersimpan lebih lama. Gunakan SQL Ullas di bawah ini sebagai gantinya.
Charles Graham

3
Saya menemukan bahwa jawaban ini hanya akan mencari 4000 karakter pertama dari teks prosedur tersimpan. Lihat tautan ini untuk jawaban yang sebenarnya. sqlhints.com/2011/10/01/...
Hunter Nelson

Sama di sini, information_schema tidak mencari konten-teks (dalam SProcs), alih-alih penggunaan "sys.procedures" bekerja untuk saya. Saya mengerti bahwa Microsoft merekomendasikan penggunaan information_schema, namun ternyata ini tidak berfungsi untuk banyak orang, oleh karena itu Microsoft harus memeriksa masalah ini.
Eddie Kumar

319

Coba permintaan ini:

Pertanyaan

SELECT name
FROM   sys.procedures
WHERE  Object_definition(object_id) LIKE '%strHell%'

56

Sudahkah Anda mencoba menggunakan beberapa alat pihak ketiga untuk melakukan pencarian? Ada beberapa tersedia di luar sana yang gratis dan yang menyelamatkan saya banyak waktu di masa lalu.

Di bawah ini adalah dua Addins SSMS yang saya gunakan dengan kesuksesan baik.

Pencarian ApexSQL - Mencari skema dan data dalam database dan memiliki fitur tambahan seperti pelacakan ketergantungan dan banyak lagi ...

Paket Alat SSMS - Memiliki fungsi pencarian yang sama dengan yang sebelumnya dan beberapa fitur keren lainnya. Tidak gratis untuk SQL Server 2012 tetapi masih sangat terjangkau.

Saya tahu jawaban ini tidak 100% terkait dengan pertanyaan (yang lebih spesifik) tetapi mudah-mudahan orang lain akan menemukan ini berguna.


35

Saya biasanya menjalankan yang berikut untuk mencapai itu:

select distinct object_name(id) 
from syscomments 
where text like '%[ABD]%'
order by object_name(id) 

31

Praktik yang baik untuk bekerja dengan SQL Server.

Buat prosedur tersimpan di bawah ini dan atur kunci pendek,

CREATE PROCEDURE [dbo].[Searchinall]       
(@strFind AS VARCHAR(MAX))
AS
BEGIN
    SET NOCOUNT ON; 
    --TO FIND STRING IN ALL PROCEDURES        
    BEGIN
        SELECT OBJECT_NAME(OBJECT_ID) SP_Name
              ,OBJECT_DEFINITION(OBJECT_ID) SP_Definition
        FROM   sys.procedures
        WHERE  OBJECT_DEFINITION(OBJECT_ID) LIKE '%'+@strFind+'%'
    END 

    --TO FIND STRING IN ALL VIEWS        
    BEGIN
        SELECT OBJECT_NAME(OBJECT_ID) View_Name
              ,OBJECT_DEFINITION(OBJECT_ID) View_Definition
        FROM   sys.views
        WHERE  OBJECT_DEFINITION(OBJECT_ID) LIKE '%'+@strFind+'%'
    END 

    --TO FIND STRING IN ALL FUNCTION        
    BEGIN
        SELECT ROUTINE_NAME           Function_Name
              ,ROUTINE_DEFINITION     Function_definition
        FROM   INFORMATION_SCHEMA.ROUTINES
        WHERE  ROUTINE_DEFINITION LIKE '%'+@strFind+'%'
               AND ROUTINE_TYPE = 'FUNCTION'
        ORDER BY
               ROUTINE_NAME
    END

    --TO FIND STRING IN ALL TABLES OF DATABASE.    
    BEGIN
        SELECT t.name      AS Table_Name
              ,c.name      AS COLUMN_NAME
        FROM   sys.tables  AS t
               INNER JOIN sys.columns c
                    ON  t.OBJECT_ID = c.OBJECT_ID
        WHERE  c.name LIKE '%'+@strFind+'%'
        ORDER BY
               Table_Name
    END
END

Sekarang - Atur kunci pendek seperti di bawah ini,

masukkan deskripsi gambar di sini

Jadi lain kali setiap kali Anda ingin mencari teks tertentu dalam salah satu dari empat objek seperti Store procedure, Views, Functionsdan Tables. Anda hanya perlu menulis kata kunci itu dan tekan tombol pintas.

Misalnya: Saya ingin mencari 'PaymentTable' lalu menulis 'PaymentTable' dan pastikan Anda memilih atau menyorot kata kunci tertulis di editor kueri dan tekan tombol pintas ctrl+4- ini akan memberi Anda hasil lengkap.


Dalam SSMS v18.2 (terhubung ke Azure) kode berfungsi dengan baik. Kunci singkat mengembalikan Procedure or function 'Searchinall' expects parameter '@strFind', which was not suppliedAda ide?
gordon613

@ gordon613 sudahkah Anda mengetik kata kunci untuk pencarian sambil menekan tombol pintas pada SSMS? misal 'Karyawan' lalu ctrl + 4
pedram

@ pedram.- terima kasih! Sekarang saya telah membuatnya berfungsi - pada pengaturan saya, Anda perlu mengetikkan kata kunci, lalu menyorotinya, lalu tekan CTRL + 4
gordon613

ya kita perlu menyorot / memilih kata kunci sebelum menekan CTRL + 4. Terima kasih sobat!
pedram

1
@AngelWarrior, Anda mungkin telah mencobanya dalam permintaan baru dan seharusnya berhasil untuk Anda. Maksud saya tidak perlu me-restart SSMS. Terima kasih telah menyediakan jalur Pintasan untuk SSMS 18.2.
pedram


19

Tolong anggap ini sebagai alternatif "kotor" tetapi ini menyelamatkan saya berkali-kali terutama ketika saya tidak terbiasa dengan proyek DB. Kadang-kadang Anda mencoba mencari string di dalam semua SP dan lupa bahwa beberapa logika terkait mungkin bersembunyi di antara Fungsi dan Pemicu atau itu bisa saja diucapkan secara berbeda dari yang Anda pikirkan.

Dari MSSMS Anda, Anda dapat mengklik kanan DB dan pilih Tasks -> Generate Scriptswizard untuk mengeluarkan semua SP, Fns, dan Pemicu ke dalam satu file .sql.

masukkan deskripsi gambar di sini

Pastikan untuk memilih Pemicu juga!

masukkan deskripsi gambar di sini

Kemudian gunakan Sublime atau Notepad untuk mencari string yang perlu Anda temukan. Saya tahu ini mungkin pendekatan yang cukup tidak efisien dan paranoid tetapi berhasil :)


12

Anda juga dapat menggunakan ini:

SELECT * 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION like '%Search_String%'

9
-1 Kelemahan dibandingkan dengan opsi lain INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITIONhanya memegang 4000 karakter pertama dari rutin.
Shannon Severance

8

Mungkin membantu Anda!

SELECT DISTINCT 
      A.NAME AS OBJECT_NAME,
      A.TYPE_DESC
      FROM SYS.SQL_MODULES M 
      INNER JOIN SYS.OBJECTS A ON M.OBJECT_ID = A.OBJECT_ID
      WHERE M.DEFINITION LIKE '%['+@SEARCH_TEXT+']%'
      ORDER BY TYPE_DESC

7
select top 10 * from
sys.procedures
where object_definition(object_id) like '%\[ABD\]%'

6
SELECT DISTINCT 
   o.name AS Object_Name,
   o.type_desc
FROM sys.sql_modules m        INNER JOIN        sys.objects o 
     ON m.object_id = o.object_id WHERE m.definition Like '%[String]%';

5

Anda juga dapat menggunakan:

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

Itu termasuk komentar


3
Anda tidak boleh menggunakan syscomments untuk tujuan ini. Bidang teks terpotong pada 4000 karakter. Bidang definisi dari sys.sql_modules tampaknya menyimpan seluruh teks (lebih dari 4000)
jlnorsworthy

5
 SELECT DISTINCT OBJECT_NAME([id]),[text] 

 FROM syscomments   

 WHERE [id] IN (SELECT [id] FROM sysobjects WHERE xtype IN 

 ('TF','FN','V','P') AND status >= 0) AND  

 ([text] LIKE '%text to be search%' ) 

OBJECT_NAME ([id]) -> Nama Objek (Lihat, Prosedur Penyimpanan, Fungsi Skalar, nama fungsi Tabel)

id (int) = Nomor identifikasi objek

xtype char (2) Jenis objek. Dapat berupa salah satu dari jenis objek berikut:

FN = Fungsi skalar

P = Prosedur tersimpan

V = Lihat

TF = Fungsi tabel


4

Saya membuat prosedur untuk mencari teks dalam prosedur / fungsi, tabel, tampilan, atau pekerjaan. Parameter pertama @search adalah kriteria pencarian, @target target pencarian, yaitu, prosedur, tabel, dll. Jika tidak ditentukan, cari semua. @db adalah untuk menentukan basis data yang akan dicari, default ke basis data Anda saat ini. Inilah pertanyaan saya dalam SQL dinamis.

ALTER PROCEDURE [dbo].[usp_find_objects]
(
    @search VARCHAR(255),
    @target VARCHAR(255) = NULL,
    @db VARCHAR(35) = NULL
)
AS

SET NOCOUNT ON;

DECLARE @TSQL NVARCHAR(MAX), @USEDB NVARCHAR(50)

IF @db <> '' SET @USEDB = 'USE ' + @db
ELSE SET @USEDB = ''

IF @target IS NULL SET @target = ''

SET @TSQL = @USEDB + '

DECLARE @search VARCHAR(128) 
DECLARE @target VARCHAR(128)

SET @search = ''%' + @search + '%''
SET @target = ''' + @target + '''

IF @target LIKE ''%Procedure%'' BEGIN
    SELECT o.name As ''Stored Procedures''
    FROM SYSOBJECTS o 
    INNER JOIN SYSCOMMENTS c ON o.id = c.id
    WHERE c.text LIKE @search
        AND o.xtype IN (''P'',''FN'')
    GROUP BY o.name
    ORDER BY o.name
END

ELSE IF @target LIKE ''%View%'' BEGIN
    SELECT o.name As ''Views''
    FROM SYSOBJECTS o 
    INNER JOIN SYSCOMMENTS c ON o.id = c.id
    WHERE c.text LIKE @search
        AND o.xtype = ''V''
    GROUP BY o.name
    ORDER BY o.name
END

/* Table - search table name only, need to add column name */
ELSE IF @target LIKE ''%Table%'' BEGIN
    SELECT t.name AS ''TableName''
    FROM sys.columns c 
    JOIN sys.tables t ON c.object_id = t.object_id
    WHERE c.name LIKE @search
    ORDER BY TableName
END

ELSE IF @target LIKE ''%Job%'' BEGIN
    SELECT  j.job_id,
        s.srvname,
        j.name,
        js.step_id,
        js.command,
        j.enabled 
    FROM    [msdb].dbo.sysjobs j
    JOIN    [msdb].dbo.sysjobsteps js
        ON  js.job_id = j.job_id 
    JOIN    master.dbo.sysservers s
        ON  s.srvid = j.originating_server_id
    WHERE   js.command LIKE @search
END

ELSE BEGIN 
    SELECT o.name As ''Stored Procedures''
    FROM SYSOBJECTS o 
    INNER JOIN SYSCOMMENTS c ON o.id = c.id
    WHERE c.text LIKE @search
        AND o.xtype IN (''P'',''FN'')
    GROUP BY o.name
    ORDER BY o.name

    SELECT o.name As ''Views''
    FROM SYSOBJECTS o 
    INNER JOIN SYSCOMMENTS c ON o.id = c.id
    WHERE c.text LIKE @search
        AND o.xtype = ''V''
    GROUP BY o.name
    ORDER BY o.name

    SELECT t.name AS ''Tables''
    FROM sys.columns c 
    JOIN sys.tables t ON c.object_id = t.object_id
    WHERE c.name LIKE @search
    ORDER BY Tables

    SELECT  j.name AS ''Jobs''
    FROM    [msdb].dbo.sysjobs j
    JOIN    [msdb].dbo.sysjobsteps js
        ON  js.job_id = j.job_id 
    JOIN    master.dbo.sysservers s
        ON  s.srvid = j.originating_server_id
    WHERE   js.command LIKE @search
END
'

EXECUTE sp_executesql @TSQL

Pembaruan: Jika Anda mengganti nama prosedur, itu hanya pembaruan sysobjectstetapi tidak syscomments, yang menyimpan nama lama dan karenanya prosedur itu tidak akan dimasukkan dalam hasil pencarian kecuali Anda membatalkan dan membuat ulang prosedur.


Ikuti tautan ini untuk mencari nama kolom.
Weihui Guo

3

Menggunakan CHARINDEX :

SELECT DISTINCT o.name AS Object_Name,o.type_desc
FROM sys.sql_modules m 
INNER JOIN sys.objects  o 
ON m.object_id=o.object_id
WHERE CHARINDEX('[ABD]',m.definition) >0 ;

Menggunakan PATINDEX :

SELECT DISTINCT o.name AS Object_Name,o.type_desc
FROM sys.sql_modules m 
INNER JOIN sys.objects  o 
ON m.object_id=o.object_id
WHERE PATINDEX('[[]ABD]',m.definition) >0 ; 

Menggunakan ganda [[]ABD]ini mirip dengan melarikan diri:

WHERE m.definition LIKE '%[[]ABD]%'

3

coba ini juga:

   SELECT ROUTINE_NAME 
    FROM INFORMATION_SCHEMA.ROUTINES 
    WHERE ROUTINE_DEFINITION like '%\[ABD\]%'

1
Select distinct OBJECT_NAME(id) from syscomments where text like '%string%' AND OBJECTPROPERTY(id, 'IsProcedure') = 1 

1

Kueri ini adalah teks pencarian dalam prosedur tersimpan dari semua database.

DECLARE @T_Find_Text VARCHAR(1000) = 'Foo'

IF OBJECT_ID('tempdb..#T_DBNAME') IS NOT NULL DROP TABLE #T_DBNAME
IF OBJECT_ID('tempdb..#T_PROCEDURE') IS NOT NULL DROP TABLE #T_PROCEDURE

CREATE TABLE #T_DBNAME
(
    IDX int IDENTITY(1,1) PRIMARY KEY 
    , DBName VARCHAR(255)
)

CREATE TABLE #T_PROCEDURE
(
    IDX int IDENTITY(1,1) PRIMARY KEY 
    , DBName VARCHAR(255)
    , Procedure_Name VARCHAR(MAX)
    , Procedure_Description VARCHAR(MAX)
)

INSERT INTO #T_DBNAME (DBName)
SELECT name FROM master.dbo.sysdatabases

DECLARE @T_C_IDX INT = 0
DECLARE @T_C_DBName VARCHAR(255)
DECLARE @T_SQL NVARCHAR(MAX)
DECLARE @T_SQL_PARAM NVARCHAR(MAX) 

SET @T_SQL_PARAM =   
    '   @T_C_DBName VARCHAR(255)
        , @T_Find_Text VARCHAR(255)
    '  


WHILE EXISTS(SELECT TOP 1 IDX FROM #T_DBNAME WHERE IDX > @T_C_IDX ORDER BY IDX ASC)
BEGIN

    SELECT TOP 1 
    @T_C_DBName = DBName 
    FROM #T_DBNAME WHERE IDX > @T_C_IDX ORDER BY IDX ASC

    SET @T_SQL = ''

    SET @T_SQL = @T_SQL + 'INSERT INTO #T_PROCEDURE(DBName, Procedure_Name, Procedure_Description)'
    SET @T_SQL = @T_SQL + 'SELECT SPECIFIC_CATALOG, ROUTINE_NAME, ROUTINE_DEFINITION '
    SET @T_SQL = @T_SQL + 'FROM ' + @T_C_DBName +  '.INFORMATION_SCHEMA.ROUTINES  '
    SET @T_SQL = @T_SQL + 'WHERE ROUTINE_DEFINITION LIKE ''%''+ @T_Find_Text + ''%'' '
    SET @T_SQL = @T_SQL + 'AND ROUTINE_TYPE = ''PROCEDURE'' '

    BEGIN TRY
        EXEC SP_EXECUTESQL  @T_SQL, @T_SQL_PARAM, @T_C_DBName, @T_Find_Text
    END TRY
    BEGIN CATCH
        SELECT @T_C_DBName + ' ERROR'
    END CATCH

    SET @T_C_IDX = @T_C_IDX + 1
END

SELECT IDX, DBName, Procedure_Name FROM #T_PROCEDURE ORDER BY DBName ASC

0
/* 
    SEARCH SPROCS & VIEWS

    The following query will allow search within the definitions 
    of stored procedures and views.

    It spits out the results as XML, with the full definitions, 
    so you can browse them without having to script them individually.

*/

/*
   STEP 1: POPULATE SEARCH KEYS. (Set to NULL to ignore)
*/
DECLARE 
    @def_key varchar(128) = '%foo%',      /* <<< definition search key */
    @name_key varchar(128) = '%bar%',     /* <<< name search key       */
    @schema_key varchar(128) = 'dbo';     /* <<< schema search key     */

;WITH SearchResults AS (
    /* 
       STEP 2: DEFINE SEARCH QUERY AS CTE (Common Table Expression)
    */
    SELECT 
        [Object].object_id                       AS [object_id],    
        [Schema].name                            AS [schema_name], 
        [Object].name                            AS [object_name],
        [Object].type                            AS [object_type],
        [Object].type_desc                       AS [object_type_desc],
        [Details].definition                     AS [module_definition]
    FROM  
        /* sys.sql_modules = where the body of sprocs and views live */
        sys.sql_modules AS [Details] WITH (NOLOCK)
    JOIN
        /* sys.objects = where the metadata for every object in the database lives */
        sys.objects AS [Object] WITH (NOLOCK) ON [Details].object_id = [Object].object_id
    JOIN 
        /* sys.schemas = where the schemas in the datatabase live */
        sys.schemas AS [Schema] WITH (NOLOCK) ON [Object].schema_id = [Schema].schema_id
    WHERE 
        (@def_key IS NULL OR [Details].definition LIKE @def_key)      /* <<< searches definition */
        AND (@name_key IS NULL OR [Object].name LIKE @name_key)       /* <<< searches name       */
        AND (@schema_key IS NULL OR [Schema].name LIKE @schema_key)   /* <<< searches schema     */
)
/* 
   STEP 3: SELECT FROM CTE INTO XML
*/

/* 
    This outer select wraps the inner queries in to the <sql_object> root element 
*/
SELECT 
(
    /* 
        This inner query maps stored procedure rows to <procedure> elements
    */
    SELECT TOP 100 PERCENT
        [object_id]                            AS [@object_id], 
        [schema_name] + '.' + [object_name]    AS [@full_name],
        [module_definition]                    AS [module_definition]
    FROM
        SearchResults
    WHERE
        object_type = 'P'
    ORDER BY
        [schema_name], [object_name]
    FOR XML
        PATH ('procedure'), TYPE
) AS [procedures],  /* <<< as part of the outer query, 
                           this alias causes the <procedure> elements
                           to be wrapped within the <procedures> element */
(
    /* 
        This inner query maps view rows to <view> elements
    */
    SELECT TOP 100 PERCENT 
        [object_id]                            AS [@object_id], 
        [schema_name] + '.' + [object_name]    AS [@full_name],
        [module_definition]                    AS [module_definition]
    FROM
        SearchResults
    WHERE
        object_type = 'V'
    ORDER BY
        [schema_name], [object_name]
    FOR XML
        PATH ('view'), TYPE
) AS [views]  /* <<< as part of the outer query, 
                     this alias causes the <view> elements
                     to be wrapped within the <views> element */
FOR XML 
    PATH ('sql_objects')

0

Sering kali saya menggunakan skrip ini untuk mencari tahu procs mana yang harus diubah, atau untuk mencari tahu apa yang menggunakan kolom tabel, atau tabel itu sama sekali untuk menghapus beberapa sampah lama. Itu memeriksa setiap database pada contoh itu dijalankan oleh sp_msforeachdb luar biasa disediakan.

if object_id('tempdb..##nothing') is not null
    drop table ##nothing

CREATE TABLE ##nothing
(
    DatabaseName varchar(30),
    SchemaName varchar(30),
    ObjectName varchar(100),
    ObjectType varchar(50)
)

EXEC master.sys.sp_msforeachdb 
'USE ?
insert into ##nothing
SELECT 
db_name() AS [Database],
[Scehma]=schema_name(o.schema_id), 
o.Name, 
o.type 
FROM sys.sql_modules m
INNER JOIN sys.objects o
    ON o.object_id = m.object_id
WHERE 
    m.definition like ''%SOME_TEXT%'''  
--edit this text

SELECT * FROM ##nothing n
order by OBJECTname 

oh, ya ... begitukah!
Bitcoin Murderous Maniac

0
-- Applicable for SQL 2005+
USE YOUR_DATABASE_NAME //;
    GO

SELECT [Scehma] = schema_name(o.schema_id)
    ,o.NAME
    ,o.type
FROM sys.sql_modules m
INNER JOIN sys.objects o ON o.object_id = m.object_id
WHERE m.DEFINITION LIKE '%YOUR SEARCH KEYWORDS%'
GO

-2

Anda juga bisa menggunakan

CREATE PROCEDURE [Search](
    @Filter nvarchar(max)
)
AS
BEGIN

SELECT name
FROM   procedures
WHERE   definition LIKE '%'+@Filter+'%'

END

dan kemudian jalankan

exec [Search] 'text'

Klausa WHERE tidak memiliki referensi bidang. Anda juga harus merujuk skema (sys)
Roger Willcocks
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.