2012-03-07 6 views
0

SQL INSERT 문을 개체 (텍스트로 표시)로 구문 분석하고 싶습니다.테이블 이름에 대한 SQL 스크립트 구문 분석

INSERT INTO Document(Id, Name, Description ...) 
    VALUES('DC001', 'FOO', 'bar'); 

INSERT INTO DocType(Id, Name) 
    VALUES('DT001', 'DOCX'); 

및 더 많은 테이블 삽입을 포함하는 SQL 스크립트 파일이 있습니다.

테이블 이름 (Document, DocType, ..)을 파싱하는 가장 쉬운 방법은 무엇입니까?

부분 문자열을 계산하고 싶지 않다면 RegEx에서 가능합니까? 대신 고려하지 않은 경우를 Regex을 사용하고 아마 가장자리를 많이 놓치게의

const string pattern = @"INSERT INTO\s\w"; 

     foreach (var line in FileContent) 
     { 
      var a = Regex.Match(line, pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase); 
      if (a.Success) 
      { 

      } 
     } 

답변

0

정규식이 모든 것이, 더 에지의 경우입니다입니다 트릭을

private readonly IList<string> _tableList = new List<string>(); 

public const string TableName = @"\s*(INSERT|UPDATE)\s*(INTO|\w+)\s*(\w+)\s*(\(|VALUES|SET)"; 
public static readonly Regex ValidLine = new Regex(TableName, RegexOptions.Compiled | RegexOptions.IgnoreCase); 

var currentTableName = ValidLine.Match(line); 
var value = currentTableName.Groups[3].Value; 

if (!_tableList.Contains(value)) 
{ 
     _tableList.Add(value); 
} 
1

는 전용 SQL 파서를 사용하여보십시오.

.NET 용 SQL 파서에는 severalrelated 개의 질문이 있습니다.

+0

했다. 필요한 것은 테이블 이름, 필드 및 값 배열입니다. – kayz1

+0

@ kayz1 - 나는 필요한 경우 DML을 작성하는 것과 같은 여러 가지 경우에 대해 말하고 있습니다. – Oded

+0

Oded와 Regex는 가난한 사람의 해결책입니다. 결국 깨뜨릴 수 있고, 길을 잃고 이익보다 비용이 많이들 것입니다. . –