我有一个类,用于通过批处理分隔符将一个sql命令字符串“拆分”成一个依次运行的sql命令列表,例如“go”。
...
private static IEnumerable<string> SplitByBatchIndecator(string script, string batchIndicator)
{
string pattern = string.Concat("^\\s*", batchIndicator, "\\s*$");
RegexOptions options = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Multiline;
foreach (string batch in Regex.Split(script, pattern, options))
{
yield return batch.Trim();
}
}
我当前的实现使用
Regex
具有
yield
但我不确定这是不是最好的方法。
-
应该很快
-
它应该处理大字符串(例如,我有一些10MB大小的脚本)
-
最困难的部分(上面的代码目前没有这样做)是考虑引用的文本
当前,将错误地拆分以下SQL:
var batch = QueryBatch.Parse(@"-- issue...
insert into table (name, desc)
values('foo', 'if the
go
is on a line by itself we have a problem...')");
Assert.That(batch.Queries.Count, Is.EqualTo(1), "This fails for now...");
我考虑过一个基于令牌的解析器,它跟踪开闭引号的状态,但不确定regex是否会这样做。
任何想法!?