SQL Server의 저장 프로 시저에서 텍스트 검색


820

모든 데이터베이스 저장 프로 시저에서 텍스트를 검색하고 싶습니다. 아래 SQL을 사용합니다.

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]대괄호를 포함한 모든 저장 프로 시저에서 검색하고 싶지만 올바른 결과를 제공하지 않습니다. 이를 위해 쿼리를 어떻게 변경할 수 있습니까?

답변:


570

대괄호를 피하십시오.

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

그러면 대괄호는 와일드 카드가 아닌 문자열 리터럴로 취급됩니다.


스키마 이름을 지정하지 마십시오 :(
Imad

4
@Imad SCHEMA_NAME(o.schema_id) AS Schema_Nameselect 절 에 추가하여 스키마 이름을 얻을 수 있습니다 .
patricus

6
더 긴 저장 프로 시저에서는 작동하지 않습니다. 대신 아래 Ullas의 SQL을 사용하십시오.
Charles Graham

3
이 답변이 저장 프로 시저 텍스트의 처음 4000 자만 검색하는 어려운 방법을 찾았습니다. 실제 답변은이 링크를 확인하십시오. sqlhints.com/2011/10/01/…
헌터 넬슨

여기에서 information_schema는 (SProcs 내에서) 컨텐츠 텍스트를 검색하지 않고 "sys.procedures"를 대신 사용했습니다. Microsoft는 information_schema를 사용하는 것이 좋습니다. 그러나 이것이 많은 경우에는 효과가 없으므로 Microsoft는이 문제를 조사해야합니다.
Eddie Kumar

319

이 요청을 시도하십시오 :

질문

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

56

검색을 위해 타사 도구를 사용해 보셨습니까? 무료로 사용할 수 있고 과거에 많은 시간을 절약 할 수있는 몇 가지가 있습니다.

아래는 제가 성공적으로 사용한 SSMS Addins 두 가지입니다.

ApexSQL 검색 – 데이터베이스에서 스키마와 데이터를 모두 검색하며 종속성 추적 등과 같은 추가 기능이 있습니다.

SSMS 도구 팩 – 이전 기능과 다른 멋진 기능과 동일한 검색 기능이 있습니다. SQL Server 2012에는 무료가 아니지만 여전히 저렴합니다.

나는이 답변이 질문과 100 % 관련이 없다는 것을 알고 있지만 (다른 사람들이) 이것이 유용 할 것으로 기대합니다.


35

나는 보통 그것을 달성하기 위해 다음을 실행합니다.

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

31

SQL Server를 사용하는 것이 좋습니다.

아래 저장 프로 시저를 만들고 짧은 키를 설정하십시오.

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

자-아래처럼 단축키를 설정하십시오.

여기에 이미지 설명을 입력하십시오

다음에 그래서 당신은 같은 네 개의 개체 중 하나에서 특정 텍스트를 찾을 할 때마다 Store procedure, Views, FunctionsTables. 해당 키워드를 작성하고 바로 가기 키를 누르면됩니다.

예를 들어 'PaymentTable'을 검색 한 다음 'PaymentTable'을 작성하고 쿼리 편집기에서 작성된 키워드를 선택하거나 강조 표시하고 바로 가기 키를 누르면 ctrl+4전체 결과가 제공됩니다.


SSMS v18.2 (Azure에 연결됨)에서 코드는 훌륭하게 작동합니다. 짧은 키는 Procedure or function 'Searchinall' expects parameter '@strFind', which was not supplied어떤 아이디어를 반환 합니까?
gordon613

@ gordon613 SSMS에서 단축키를 누르는 동안 검색 할 키워드를 입력 했습니까? 예 : '직원'및 ctrl + 4
pedram

@ pedram.- 감사합니다! 이제 설정이 완료되었습니다. 설정에서 키워드를 입력하고 강조 표시 한 다음 Ctrl + 4
gordon613

예, CTRL + 4를 누르기 전에 키워드를 강조 / 선택해야합니다. 고마워 친구!
pedram

1
@AngelWarrior, 당신은 그것을 새로운 쿼리로 시도했을 것이고 그것은 당신을 위해 일했을 것입니다. SSMS를 다시 시작할 필요가 없습니다. SSMS 18.2에 대한 바로 가기 경로를 제공해 주셔서 감사합니다.
pedram


19

이것을 "더러운"대안으로 사용하십시오. 그러나 이것은 특히 DB 프로젝트에 익숙하지 않을 때 많은 시간을 절약했습니다. 때로는 모든 SP 내에서 문자열을 검색하려고 할 때 관련 논리 중 일부가 함수와 트리거 사이숨겨져 있거나 생각과 다르게 다르게 표현 될 수 있다는 것을 잊어 버리 십시오.

MSSMS에서 DB를 마우스 오른쪽 단추로 클릭하고 Tasks -> Generate Scripts마법사를 선택 하여 모든 SP, Fns 및 트리거를 단일 .sql 파일로 출력 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

트리거도 선택하십시오!

여기에 이미지 설명을 입력하십시오

그런 다음 Sublime 또는 Notepad사용 하여 찾을 문자열을 검색 하십시오 . 나는 이것이 매우 비효율적이며 편집증 적 인 접근법 일 수 있음을 알고 있지만 작동합니다 :)


12

이것을 사용할 수도 있습니다 :

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

9
-1 다른 옵션과 비교하여 단점 INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION은 루틴의 처음 4000 자만 보유합니다.
섀넌 세브란스

8

도움이 될 것입니다!

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


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

또한 다음을 사용할 수 있습니다.

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

의견 포함


3
이 목적으로 syscomments를 사용해서는 안됩니다. 텍스트 필드는 4000 자로 잘립니다. sys.sql_modules의 정의 필드는 전체 텍스트를 저장하는 것으로 보입니다 (어쨌든 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])-> 개체 이름 (보기, 저장 프로 시저, 스칼라 함수, 테이블 함수 이름)

id (int) = 객체 식별 번호

xtype char (2) 객체 유형. 다음 객체 유형 중 하나 일 수 있습니다.

FN = 스칼라 함수

P = 저장 프로 시저

V =보기

TF = 테이블 함수


4

프로 시저 / 함수, 테이블, 뷰 또는 작업에서 텍스트를 검색하는 프로 시저를 만들었습니다. 첫 번째 매개 변수 @search는 검색 조건입니다. @target은 검색 대상, 즉 프로 시저, 테이블 등입니다. 지정하지 않으면 모두 검색하십시오. @db는 검색 할 데이터베이스를 지정하고 기본값은 현재 데이터베이스입니다. 다음은 동적 SQL의 쿼리입니다.

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

업데이트 : 프로 시저의 이름을 바꾼 경우에만 업데이트 sysobjects되지만 업데이트 되지는 않으므로 syscomments이전 이름을 유지하므로 프로 시저를 삭제하고 다시 작성하지 않으면 해당 프로 시저가 검색 결과에 포함되지 않습니다.


열 이름을 검색하려면 이 링크 를 따르십시오 .
Weihui Guo

3

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 ;

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 ; 

이 더블을 사용하는 것은 [[]ABD]탈출과 비슷합니다.

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

3

또한 이것을 시도하십시오 :

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


1

이 쿼리는 모든 데이터베이스에서 저장 프로 시저의 검색 텍스트입니다.

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

나는 종종이 스크립트를 사용하여 수정할 procs를 파악하거나 테이블의 열을 사용하는 것이 무엇인지 파악하거나 그 테이블을 사용하여 오래된 정크를 제거합니다. 훌륭하게 제공된 sp_msforeachdb에 의해 실행되는 인스턴스의 각 데이터베이스를 확인합니다.

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 

오, 나중에 ... 그렇습니다!
비트 코인 살인 미치광이

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

당신은 또한 사용할 수 있습니다

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

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

END

그런 다음 실행

exec [Search] 'text'

WHERE 절에 필드 참조가 누락되었습니다. 또한 스키마 (sys)를 참조해야합니다.
Roger Willcocks
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.