SQL Server'da saklı yordamda metin arama


820

Tüm veritabanı saklı yordamlarımdan bir metin aramak istiyorum. Aşağıdaki SQL kullanın:

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]%';

[ABD]Köşeli parantez dahil tüm saklı yordamları aramak istiyorum , ancak doğru sonuç vermiyor. Bunu başarmak için sorgumu nasıl değiştirebilirim?

Yanıtlar:


570

Köşeli parantezlerden kaçın:

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

Ardından köşeli parantezler, joker karakterler olarak değil, dize değişmezleri olarak kabul edilir.


şema adı vermeyin :(
Imad

4
@Imad Seçim şemasına ekleyerek şema adını alabilirsiniz SCHEMA_NAME(o.schema_id) AS Schema_Name.
patricus

6
Bu, daha uzun saklı yordamlarla çalışmaz. Bunun yerine Ullas'ın SQL'ini kullanın.
Charles Graham

3
Bu cevabın sadece saklı yordam metninin ilk 4000 karakterini arayacağını zor yoldan öğrendim. Gerçek cevap için bu bağlantıya göz atın. sqlhints.com/2011/10/01/…
Hunter Nelson

Burada aynı şekilde, information_schema (SProcs içinde) içerik metni aramadı, bunun yerine "sys.procedures" kullanımı benim için çalıştı. Microsoft'un information_schema kullanımını önerdiğini anlıyorum, ancak görünüşe göre bu pek çok kişi için çalışmıyor, bu nedenle Microsoft bu soruna bakmalıdır.
Eddie Kumar

319

Bu isteği deneyin:

Sorgu

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

56

Aramayı yapmak için üçüncü taraf araçlarından bazılarını kullanmayı denediniz mi? Orada ücretsiz olan ve geçmişte bana tonlarca zaman kazandıran birkaç tane var.

Aşağıda, başarılı bir şekilde kullandığım iki SSMS Addins var.

ApexSQL Arama - Veri tabanlarında hem şemayı hem de verileri arar ve bağımlılık izleme ve daha fazlası gibi ek özelliklere sahiptir…

SSMS Araçlar paketi - Bir öncekiyle ve diğer birkaç harika özellikle aynı arama işlevselliğine sahiptir. SQL Server 2012 için ücretsiz değil ama yine de çok uygun.

Bu cevabın% 100 (daha spesifik olan) sorularla ilgili olmadığını biliyorum ama umarım diğerleri bunu faydalı bulacaktır.


35

Bunu başarmak için genellikle aşağıdakileri çalıştırırım:

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

31

SQL Server ile çalışmak için iyi bir uygulama.

Saklı yordamın altında oluşturun ve kısa tuşu ayarlayın,

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

Şimdi - Kısa tuşu aşağıdaki gibi ayarlayın,

resim açıklamasını buraya girin

Bir dahaki sefere Yani böyle dört nesnelerin herhangi belirli bir metin bulmak istediğinizde Store procedure, Views, Functionsve Tables. Sadece bu anahtar kelimeyi yazmanız ve kısayol tuşuna basmanız yeterlidir.

Örneğin: 'PaymentTable'ı aramak ve sonra' PaymentTable 'yazmak ve sorgu düzenleyicide yazılı anahtar kelimeyi seçtiğinizden veya vurguladığınızdan emin olun ve kısayol tuşuna basın ctrl+4- tam sonuç verecektir.


SSMS v18.2'de (Azure'a bağlı) kod harika çalışıyor. Kısa anahtar Procedure or function 'Searchinall' expects parameter '@strFind', which was not suppliedHerhangi bir fikir verir mi?
gordon613

@ gordon613 SSMS'de kısa yol tuşuna basarken aramak için anahtar kelime yazdınız mı? örneğin 'Çalışan' ve sonra ctrl + 4
pedram

@ pedram. - teşekkürler! Şimdi çalıştım - kurulumumda anahtar kelimeyi yazmanız, sonra vurgulamanız ve ardından CTRL + 4
gordon613

evet CTRL + 4 tuşlarına basmadan önce anahtar kelimeyi vurgulamamız / seçmemiz gerekir. Teşekkürler dostum!
pedram

1
@AngelWarrior, Yeni sorguda denemiş olabilirsiniz ve sizin için çalışmış olmalıdır. Yani SSMS'yi yeniden başlatmaya gerek yok. SSMS 18.2 için Kısayollar yolu sağladığınız için teşekkür ederiz.
pedram


19

Lütfen bunu "kirli" bir alternatif olarak kabul edin, ancak özellikle DB projesine aşina olmadığımda bu arkamı defalarca kurtardı. Bazen tüm SP'ler içinde bir dize aramaya çalışıyorsunuz ve ilgili mantığın bir kısmının İşlevler ve Tetikleyiciler arasında gizlenmiş olabileceğini ya da düşündüğünüzden farklı bir şekilde ifade edilebileceğini unutuyorsunuz .

MSSMS'nizden DB'nizi sağ tıklatıp Tasks -> Generate Scriptstüm SP'leri, Fns ve Tetikleyicileri tek bir .sql dosyasına çıkarmak için sihirbazı seçebilirsiniz .

resim açıklamasını buraya girin

Tetikleyiciler'i de seçtiğinizden emin olun!

resim açıklamasını buraya girin

Daha sonra bulmanız gereken dizeyi aramak için Sublime veya Not Defteri'ni kullanın. Bunun oldukça verimsiz ve paranoyak bir yaklaşım olabileceğini biliyorum ama işe yarıyor :)


12

Bunu da kullanabilirsiniz:

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

9
-1 Diğer seçeneklere kıyasla olumsuz INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION, rutinin sadece ilk 4000 karakterini tutar.
Shannon Severance

8

Size yardımcı olabilir!

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

Ayrıca şunları kullanabilirsiniz:

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

Bu yorumlar içerir


3
Bu amaçla sis- temleri kullanmamalısınız. Metin alanı 4000 karakterle kesilir.
Sys.sql_modules

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]) -> Nesne Adı (Görünüm, Mağaza Yordamı, Skaler İşlev, Tablo işlev adı)

id (int) = Nesne tanımlama numarası

xtype char (2) Nesne türü. Aşağıdaki nesne türlerinden biri olabilir:

FN = Skaler fonksiyon

P = Saklı yordam

V = Görüntüle

TF = Tablo işlevi


4

Prosedürler / fonksiyonlar, tablolar, görünümler veya işlerde metin aramak için bir prosedür oluşturdum. @Search ilk parametresi arama ölçütüdür, @ arama hedefini hedefler, yani yordamlar, tablolar, vb. Belirtilmezse, tümünü arayın. @db, aranacak veritabanını, geçerli veritabanınıza varsayılan olarak belirtmektir. İşte benim dinamik SQL benim sorgu.

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

Güncelleme: Bir prosedürü yeniden adlandırdıysanız, yalnızca güncellenir, sysobjectsancak syscommentseski adı korur ve bu nedenle prosedürü bırakıp yeniden oluşturmazsanız bu prosedür arama sonucuna dahil edilmez.


Sütun adını aramak için bu bağlantıyı takip edin .
Weihui Guo

3

CHARINDEX kullanma :

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 ;

PATINDEX kullanma :

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 ; 

Bu çiftin [[]ABD]kullanılması kaçmaya benzer:

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

3

ayrıca şunu deneyin:

   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

Bu sorgu, saklanan yordamdaki tüm veritabanlarındaki arama metnidir.

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

Her zaman sık sık bu komut dosyasını hangi proc'ları değiştireceğini veya bir tablonun bir sütununu neyin kullandığını veya bazı eski gereksiz dosyaları kaldırmak için bu tabloyu kullanarak anlarım. Harika sağlanan sp_msforeachdb tarafından çalıştırıldığı örnekte her veritabanını denetler.

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 ... öyle mi!
Bitcoin Katil Manyak

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

Ayrıca kullanabilirsiniz

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

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

END

ve sonra koş

exec [Search] 'text'

WHERE deyiminde bir alan başvurusu eksik. Ayrıca şemaya (sys) da
başvurmalısınız
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.