2009-11-18 3 views
0

하위 문자열 "x"의 발생을 위해 모든 저장 프로 시저를 검색하려고했는데 SQL 2000에서이 작업을 수행 할 수 있습니까? 2005? 2008?SQL Server 코드 검색 도구

.. 추가 기능이 필요하지 않으십니까?

그렇지 않은 경우 무료 추가 기능은 무엇입니까?

죄송합니다. sysobjects 데이터를 사용하여이를 수행하는 방법을 알고 있다고 언급해야합니다. 하지만이 기능 앞에는 멋진 GUI가 있어야합니다! 이 같은

예를 들어

, 뭔가 : 너 내가 내가 도구를 사용하지 않을 경우

http://screencast.com/t/Y2Q0YmU0Nzkt

+0

중복 : http://stackoverflow.com/questions/1364633/search-for-a-key-word-in-all-the-stored-procs- ~을위한 -given-db –

+0

죄송합니다. sysobjects 데이터를 사용하여이를 수행하는 방법을 알고 있다고 언급해야합니다. 하지만이 기능 앞에는 멋진 GUI가 있어야합니다! – ChadD

답변

0

- 단지 스크립트를 실행 즉, 다음과 같은 SQL 스크립트 것, 당신을 위해 검색을 수행합니다 위해 xtype 'P'는 저장 프로 시저를 의미 이때 캐릭터

Declare @search varchar(128) 

SET @search = '%' + 'search text' + '%' 


/***************************************************************************/ 

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 = 'P' 
      GROUP BY o.name 
      ORDER BY o.name 

/**************************************************************************/ 

하는 DB에 저장된 모든 검색 프록

+0

syscomments는 nvarchar (4000) 만 저장하므로 4 문자의 검색 문자열이 3999에서 시작되면이 작업이 실패하므로이 작업은 신뢰할 수 없습니다. – gbn

+0

흥미 롭습니다. – Scozzard

2

또한답변 http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=32319

CREATE PROCEDURE sp_FindText @text varchar(8000), @findtype varchar(1)='P' AS 
SET NOCOUNT ON 
IF @findtype='P' SELECT DISTINCT Len(SubString(text,1, PatIndex('%' + @text + '%', text)))-Len(Replace(SubString(text,1, PatIndex('%' + @text + '%', text)),char(13),''))+1 AS Line, 
--PatIndex('%' + @text + '%', text) AS Position, 
OBJECT_NAME(id) AS ProcName 
FROM syscomments 
WHERE text like '%' + @text + '%' 
ORDER BY ProcName, Line 

IF @findtype='C' EXEC('SELECT TABLE_NAME + ''.'' + COLUMN_NAME AS TableColumn FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE ''%' + @text + '%'' ORDER BY TableColumn') 

IF @findtype='T' EXEC('SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE ''%' + @text + '%'' ORDER BY TABLE_NAME') 
GO 

에서 8,

그것은뿐만 아니라 절차 및보기 정의 텍스트, 또한 테이블, 뷰 및 열 이름을 찾을 수 검색 : SQL Server 2005 및 2008

EXEC sp_FindText 'myTable' --or-- EXEC sp_FindText 'myTable', 'P' --finds procedures/views containing 'myTable' in their definition/code 
EXEC sp_FindText 'myTable', 'T' --finds tables/views containing 'myTable' in their name 
EXEC sp_FindText 'myCol', 'C' --finds columns containing 'myCol' in their name 
+0

syscomments는 nvarchar (4000) 만 저장하므로 4 문자의 검색 문자열이 3999로 시작되면 신뢰할 수 없습니다. – gbn

+0

오해의 소지가있는 결과를 줄 수있는 잘못된 대답을 명백하게 표시하지 마십시오. – gbn

+0

검색을 놓칠 수 있음을 인정합니다. 4000 자 경계를 넘는 경우 용어입니다. 2 개의 데이터베이스 중 빠른 샘플을 보면 606 개 중 14 개가 있고 다른 하나는 4000 개 이상의 468 개 오브젝트 중 33 개가 있습니다. 나는 당신이 검색 용어를 그리는 것은 꽤 재수가 있어야한다고 생각한다. 더 나은 무엇보다 나는이 접근 방식에 만족합니다. –

1

을, 출력이 nvarchar (최대) 인 sys.sql_modules 또는 OBJECT_DEFINITION을 사용하십시오.

SELECT OBJECT_NAME(object_id) FROM sys.sql_modules WHERE definition LIKE @MyString 
SELECT name FROM sys.objects WHERE OBJECT_DEFINITION(object_id) LIKE @MyString 

SQL Server 2000의 경우 sycomments 또는 INFORMATION_SCHEMA.ROUTINES를 사용해야하지만 nvarchar (4000)를 제공하므로 은 신뢰할 수 없습니다입니다. 당신은 텍스트 값에 sys.comments을 CONCAT하고 검색해야 할 것이다 (그리고 솔직히 나는 내 머리 위에 떨어져 그것을 수행하는 방법을 잊어 버린) 정확히 같은 문제가