2012-03-07 53 views
0

我想將SQL INSERT語句解析爲對象(表示爲文本)。有一個SQL腳本文件包含:爲表名解析SQL腳本

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

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

和許多表插入。

解析表名(Document,DocType,..)最簡單的方法是什麼?

如果我不想計算子串,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

而不是使用Regex,可能錯過了大量的邊緣,你有沒有考慮過的情況下,看看使用專用的SQL語法分析程序。

還有severalrelated針對.NET的SQL解析器的問題。

+0

這是所有的,沒有邊緣的情況下。我需要的是數組中的表名,字段和值。 – kayz1 2012-03-07 17:16:48

+0

@ kayz1 - 我正在談論格式化邊緣案例,編寫所需的DML的不同方式等。 – Oded 2012-03-07 19:33:48

+0

我同意Oded,Regex是窮人的解決方案,它可以並最終打破,並且導致成本超過利潤。 – 2016-02-24 12:47:02