2009-06-05 1 views
0

SQL Server의 저장 프로 시저, 함수, 테이블 등의 코드에서 키워드를 검색 할 수있는 프로그램을 만들었습니다. 나는 모든 코드 파일에서 검색어 (예 : "ADMIN.TABLE")가 참조되는 위치를 찾는 방법을 찾고 있습니다. 참조를 찾으려면 LINQ를 사용합니다. 예를 들어 ADMIN.TABLE을 검색하면 텍스트의 어딘가에 "ADMIN.TABLE"이라는 검색어가 포함 된 텍스트 파일의 이름입니다. 그러나 ADMIN.TABLE의 변형을 포함시키지 않으면 검색이 절대적이지 않습니다. 모든 참조를 찾을 수는 없습니다. "ADMIN.TABLE"검색 2) "[ADMIN] .TABLE"검색 3) "ADMIN. [TABLE]"으로 검색 4) 다음을 검색하십시오. "[ADMIN]. [TABLE]"SQL 서버 저장 프로 시저에서 텍스트 검색

정규 표현식 패턴을 사용하려고 생각하고 있습니다. 그러나 다른 패턴을 포함 할 패턴을 어떻게 구성 할 것인지 잘 모르겠습니다. 위에 나열된 축약. 어떤 도움을 주시면 감사하겠습니다.

감사합니다,

토르

답변

0

어 ...? 이전 그룹을 0 번 또는 1 번 일치시키는 것을 의미합니다. [와] 둘 다 특별한 의미를 가지므로 여러분은 그것들과 함께 벗어나야합니다. 따라서 :

new Regex(@"\[?ADMIN\]?.\[?TABLE\]?") 

물어볼 것입니까?

2

나는 당신이 바퀴를 조금 재발 명하고 있을지도 모른다라고 생각한다. sp_depends를 보셨습니까? 내가 지정한 테이블에 의존하는 모든 개체를 나열합니다.

나는 당신이 텍스트 파일로 작업하고 있다는 것을 알고 있지만 스크립트와 함께 sp_depends 결과를 생성 할 수 있다면 문제가 해결 될 수도 있습니다.

1

시도해보십시오. 디렉토리의 모든 파일을 반복하고 대/소문자를 구분하지 않는 정규 표현식을 사용하여 검색합니다 (Directory.GetFiles 호출을 변경하여 검색 옵션을 변경하여 하위 디렉토리를 검사하지 않고 디렉토리를 검색 할 수 있음).) :

당신이 그것에 대해 이동하는 방법에 대한 설정되지 않은 경우
 string pathWithSqlFiles = @"c:\sqlfiles\"; 
     string[] files = System.IO.Directory.GetFiles(pathWithSqlFiles, "*.sql", System.IO.SearchOption.AllDirectories); 
     string regexToSearch = @"\[?admin\]?.\[?table\]?"; 
     foreach (string file in files) 
     { 
      string fileText = System.IO.File.ReadAllText(file); 
      System.Text.RegularExpressions.Match match = System.Text.RegularExpressions.Regex.Match(fileText, regexToSearch, System.Text.RegularExpressions.RegexOptions.IgnoreCase); 
      if (match.Success) 
      { 
       // do logic to handle the matched text 
      } 
     } 
0

, 당신은 SQL 스크립트를 분석하고 특히 스키마 = 관리자 & & 테이블 = 테이블을 찾기 위해 개체 모델을 사용할 수 있습니다.

옵션 1 : 예상 쿼리 계획을 생성하고 테이블 참조를 구문 분석합니다.

옵션 2 : 당신은 SQL에 있다면 당신은 같은 XML 쿼리로 얻을 수있는 2005 +

당신이 참조를 추가, 클라이언트 측에서이 일을하고 SQL2008를 원한다면 C에 : \ 프로그램 Files \ Microsoft SQL Server가 \ 100 개 \ 도구 BINN \ VSShell \ Common7 \ IDE \ Microsoft.SqlServer.SqlParser.dll \ 및

SqlScript script = Parser.Parse(@"create proc sp1 as select 'abc' as abc1"); 

좋아해요 그럼 당신은 script.Xml을 처리하고 찾아보실 수 있습니다 과 같은 노드 SqlTab을 본 이후로 객체 모델에도 강하게 입력 할 수 있습니다. 어셈블리에서 leRefExpression을 사용할 수 있지만 드릴 다운 할 위치가 명확하지 않습니다.