解析表名的SQL脚本

时间:2012-03-07 16:59:49

标签: c# regex

我想将SQL INSERT语句解析为object(表示为文本)。有一个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)
            {

            }
        }

3 个答案:

答案 0 :(得分:1)

使用专用的SQL解析器,而不是使用Regex并且可能遗漏了许多你没有考虑过的边缘情况。

针对.NET的SQL解析器存在several related个问题。

答案 1 :(得分:0)

Regex做了这个伎俩

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);
}

答案 2 :(得分:0)

我遇到了类似的问题,解析SQL文件并在Ruby上提出了这个通用的解析器。 它涵盖了所有情况,并将扫描结果记录到文件中以供进一步检查。也可以针对其他类型进行调整。 Take R10.rb file from here