<text>가 포함 된 저장 프로시 저는 어떻게 찾습니까?


답변:


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
절차가 긴 경우를 위해 routine_definition이 4000 자에서 잘립니다. 대신 OBJECTPROPERTY 방법을 사용하십시오.
PeteT

1
실행 계획에 따라 세 번째 변형은이 데이터를 얻는 가장 효과적인 방법으로 보입니다.
TMcManemy

1
@PeteT가 말한 것의 백만 배. 이 4000 문자 제한은 몇 년 전에 정말 저를 깨 물었습니다.
Vivian River

14
세 가지 쿼리 각각의 기능과 그 차이점에 대한 설명을 추가 할 수 있습니까?
Tot Zam

3
각 쿼리가 수행하는 작업과 쿼리가 어떻게 다른지 또는 한 쿼리가 다른 쿼리보다 나은 이유에 대해 자세히 설명해 두십시오. 이러한 종류의 답변은 경험이 적은 엔지니어의 맹인 / 복사 붙여 넣기 및 SQL Server와 같은 새로운 RDBMS를 사용하는 상급 엔지니어에게는 좌절을 유발합니다.
DavidScherer

78

자신의 사본을 잡아 무료 레드 게이트 SQL 검색 도구와 SQL 서버에서 검색을 즐기는 시작! :-)

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

훌륭하고 매우 유용한 도구입니다. 그렇습니다! 모든 종류의 사용에 대해 완전히 무료입니다.


5
이것은 내가이 질문에 오기 전에 이미 사용했던 훌륭한 도구입니다. 기본적으로 검색 결과를 150으로 제한한다는 점은 주목할 가치가 있습니다. 한도를 높이는 방법에 대한 정보는 이 포럼 게시물 을 확인하십시오 .
Scott

1
매우 빠르고 사용 가능한 도구입니다.
Suat Atan PhD

제한된 기능이지만 멋진 도구입니다.
Aishwarya Shiva


32

나는 카 시프의 대답을 받아들이고 그들 모두를 연합시켰다. 이상하게도 때로는 선택 중 하나에서 결과를 찾았지만 다른 하나에서는 그렇지 않았습니다. 안전을 위해 무언가를 찾을 때 3 개를 모두 실행합니다. 도움이 되었기를 바랍니다:

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

스키마가 필요한 경우 :

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
그러나 하위 문자열 일치 하므로주의하십시오 . "FieldName"은 주석, 문자열 상수 또는 이와 유사한 것으로 나타날 수 있습니다. 또한 찾고자하는 것이 의심 [whatever]됩니다 whatever(스키마 규정 식별자를 찾을 때 더 중요합니다).
CVn

2
위의 허용 된 답변에서 @PeteT의 의견을 참조하십시오. INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION은 4000 자로 잘립니다. 따라서 4000 자보다 긴 저장 프로 시저가 있으면이 방법이 작동하지 않습니다.
TMcManemy

7

위의 예제를 시도했지만 4000자를 넘지 않고 조금 수정하고 전체 저장 프로 시저 정의를 얻을 수있었습니다. 아래의 업데이트 된 스크립트를 참조하십시오-

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

먼저 사용자 자격 증명과 올바른 데이터베이스 컨텍스트에서 쿼리를 실행하고 있는지 확인하십시오.

USE YOUR_DATABASE_NAME;

그렇지 않으면 sys.procedures는 아무 것도 반환하지 않습니다. 이제 아래와 같이 쿼리를 실행하십시오.

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

또 다른 옵션은 INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION을 사용하는 것이지만 루틴의 제한된 수의 문자 (즉, 첫 4000 자) 만 보유합니다.

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

Microsoft SQL Server 2008 R2 (SP1)-10.50.2500.0 (X64)에서 테스트했습니다.



2

다음은 Losbear를 사용하지만 스키마 이름을 출력하도록 수정 된 통합 버전입니다.

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

텍스트 또는 문자열이 포함 된 저장 프로 시저를 찾는 방법

많은 시간 동안 저장 프로 시저에서 텍스트 나 문자열을 찾아야합니다. 다음은 포함 텍스트를 찾는 쿼리입니다.

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

자세한 내용은 아래 주어진 URL을 확인하십시오.

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


2

SQL Server 2000보다 새로운 SQL Server의 경우 :

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

누군가가 SQL Server 2000에 갇혀 있으면 sql_modules 테이블이 존재하지 않으므로 syscomments를 사용하면 4000보다 큰 저장 프로 시저에 대한 여러 레코드가 있지만 동일한 c.number 필드가 있으므로 그룹화 할 수 있습니다 전체 저장 프로 시저 텍스트를 얻기 위해 파트를 함께 사용 :

    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

이 쿼리는 저장 프로 시저 내에서 "XXXX"가 참조되는 저장 프로 시저의 이름과 내용을 반환합니다.

이것은 특정 테이블 / 뷰 / 프로 시저를 참조하는 프로 시저를 찾을 때 유용합니다.


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

이것이 "CompanySpecialisation"과 같은 이름의 모든 저장 프로 시저를 선택하기 위해 SQL 2012에서 작성한 것입니다.


0

SP에서 텍스트를 찾기위한 저장 프로 시저. {Dinesh Baskaran} 최신 유행 글로벌 시스템 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)

이 시도 .....


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

모든 데이터베이스의 모든 저장 프로 시저에서 검색합니다. 이것은 긴 절차에도 적용됩니다.


0

이 스크립트를 사용합니다. XML 주석을 노란색 배경에 검은 색 텍스트로 표시하도록 변경하면 결과의 xml 열에서 원하는 텍스트를 강조 표시하는 효과가 나타납니다. (도구-> 옵션-> 환경-> 글꼴 및 색상 [표시 항목 : XML 주석]

    ---------------------------------------------
    --------------   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     -----------------
    ---------------------------------------------
    ---------------------------------------------
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.