복붙노트

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

SQL

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

내 모든 데이터베이스 저장 프로 시저에서 텍스트를 검색 할. 나는 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]%';

나는 대괄호를 포함하여 모든 저장 프로 시저에서 [AND]을 검색하려면,하지만 적절한 결과를 포기하지 않을거야. 어떻게 이것을 달성하기 위해 내 쿼리를 변경할 수 있습니까?

해결법

  1. ==============================

    1.대괄호 탈출 :

    대괄호 탈출 :

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

    문자열 와일드 카드로하지 리터럴로 그 다음 대괄호가 처리됩니다.

  2. ==============================

    2.이 요청을보십시오 :

    이 요청을보십시오 :

    질문

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

    3.당신은 검색을 수행 할 타사 도구의 일부를 사용하여 시도 적이 있습니까? 이 몇 가지 가능한 아웃이 없는지 그리고 그 과거에 나에게 시간의 톤을 저장.

    당신은 검색을 수행 할 타사 도구의 일부를 사용하여 시도 적이 있습니까? 이 몇 가지 가능한 아웃이 없는지 그리고 그 과거에 나에게 시간의 톤을 저장.

    다음은 두 SSMS 추가 기능 내가 좋은 성공을 사용합니다.

    ApexSQL 검색 - 데이터베이스에 스키마와 데이터를 모두 검색 및 의존성 추적 등과 같은 추가 기능을 가지고 있습니다 ...

    도구 팩 SSMS는 - 이전과 다른 여러 가지 멋진 기능과 동일한 검색 기능을 가지고 있습니다. SQL 서버 2012 무료하지만 여전히 아주 저렴하지 않습니다.

    나는이 대답이 질문에 관련된 100 % 아니라는 것을 알고 (더 구체적으로 어떤이었다) 그러나 희망 다른 사람이 유용하게 찾을 수 있습니다.

  4. ==============================

    4.나는 보통 그것을 달성하기 위해 다음과 같은 실행

    나는 보통 그것을 달성하기 위해 다음과 같은 실행

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

    5.SQL Server와 함께 작동하는 것이 좋습니다.

    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
    

    지금은 - 아래 짧은 키를 설정,

    당신이 저장 프로 시저, 뷰, 함수 및 테이블과 같은 네 개의 개체 중 하나에서 특정 텍스트를 찾을 할 때마다 그래서 다음 시간. 당신은 키워드를 눌러 짧은 키를 작성해야합니다.

    예를 들면 : 나는 다음 쓰기 'PaymentTable' 'PaymentTable'를 검색하고 당신이 선택하거나 쿼리 편집기를 눌러 짧은 키 CTRL + 4에 기록 된 키워드를 강조 할 - 그것은 당신에게 전체 결과를 제공 할 것입니다.

  6. ==============================

    6.레드 게이트 SQL 검색이 작업을 수행하는 훌륭한 도구입니다, 그것은 SSMS를위한 무료 플러그인입니다.

    레드 게이트 SQL 검색이 작업을 수행하는 훌륭한 도구입니다, 그것은 SSMS를위한 무료 플러그인입니다.

  7. ==============================

    7.대안은 "더러운"로이 걸리지 만이 내가 DB 프로젝트에 익숙하지 않았다 특히 내 뒤에 많은 시간을 저장하시기 바랍니다. 때때로 당신은 모든 SP를 내 문자열을 검색하고, 관련 논리의 일부 기능 및 트리거 또는 당신이 생각했던 것보다 단순히 다르게 표시 될 수 사이에 숨어되었을 수도 있음을 잊지 위해 노력하고 있습니다.

    대안은 "더러운"로이 걸리지 만이 내가 DB 프로젝트에 익숙하지 않았다 특히 내 뒤에 많은 시간을 저장하시기 바랍니다. 때때로 당신은 모든 SP를 내 문자열을 검색하고, 관련 논리의 일부 기능 및 트리거 또는 당신이 생각했던 것보다 단순히 다르게 표시 될 수 사이에 숨어되었을 수도 있음을 잊지 위해 노력하고 있습니다.

    당신의 MSSMS에서 당신은 바로 DB를 클릭하여 선택할 수 있습니다 작업 -> 생성 스크립트 출력에 하나의 .SQL 파일로 모든 SP에, FNS 및 트리거 마법사를 실행합니다.

    너무 트리거를 선택해야합니다!

    그런 다음 당신이 찾을 필요가있는 문자열을 검색 할 수 블림 또는 메모장을 사용합니다. 나는 이것이 매우 비효율적이고 편집증 방법이 될 수 있습니다 알고 있지만, 그것을 작동합니다 :)

  8. ==============================

    8.당신이 하나를 사용할 수 있습니다 :

    당신이 하나를 사용할 수 있습니다 :

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

    9.그것은 당신을 도움이 될 수 있습니다!

    그것은 당신을 도움이 될 수 있습니다!

    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
    
  10. ==============================

    10.

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

    11.

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

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

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

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

    그게 전부는 주석을 포함

  13. ==============================

    13.

     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]) -> 오브젝트 이름 (보기, 저장 프로 시저, 스칼라 함수, 테이블 함수 이름)

    아이디 (INT) = 개체 식별 번호

    위해 xtype의 문자 (2) 개체 유형. 다음 개체 유형 중 하나 일 수 있습니다 :

    FN 스칼라 함수 =

    P = 저장 프로 시저

    V =보기

    TF = 이블

  14. ==============================

    14.나는 절차 / 기능, 테이블, 뷰, 또는 작업에서 텍스트를 검색하는 절차를 만들었습니다. 검색 기준, @Target 검색 대상, 즉, 프로 시저, 테이블 등을 지정하지 않은 경우이다 @search 첫번째 파라미터는 모든 검색. @db은 현재 데이터베이스에 기본을 검색 할 데이터베이스를 지정하는 것입니다. 여기에 동적 SQL 내 쿼리입니다.

    나는 절차 / 기능, 테이블, 뷰, 또는 작업에서 텍스트를 검색하는 절차를 만들었습니다. 검색 기준, @Target 검색 대상, 즉, 프로 시저, 테이블 등을 지정하지 않은 경우이다 @search 첫번째 파라미터는 모든 검색. @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
    
  15. ==============================

    15.CHARINDEX 사용 :

    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 ; 
    

    이 배 [[AND]를 사용하여 탈출과 유사합니다 :

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

    16.이 시도 :

    이 시도 :

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

    17.

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

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

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

    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
    
  19. ==============================

    19.

    /* 
        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')
    
  20. ==============================

    20.모든 너무 자주 발동 수정, 또는 오래된 쓰레기를 제거하기 위해 모두에서 테이블의 열, 또는 테이블을 사용 알아낼 알아낼이 스크립트를 사용합니다. 그것은 훌륭하게 공급 sp_msforeachdb에 의해에서 실행되는 인스턴스의 각 데이터베이스를 확인합니다.

    모든 너무 자주 발동 수정, 또는 오래된 쓰레기를 제거하기 위해 모두에서 테이블의 열, 또는 테이블을 사용 알아낼 알아낼이 스크립트를 사용합니다. 그것은 훌륭하게 공급 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 
    
  21. ==============================

    21.

    -- 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
    
  22. ==============================

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

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

    CREATE PROCEDURE [Search](
        @Filter nvarchar(max)
    )
    AS
    BEGIN
    
    SELECT name
    FROM   procedures
    WHERE   definition LIKE '%'+@Filter+'%'
    
    END
    

    다음 실행

    exec [Search] 'text'
    
  23. from https://stackoverflow.com/questions/14704105/search-text-in-stored-procedure-in-sql-server by cc-by-sa and MIT license