У меня есть класс, который я использую, чтобы «разделить» строку команд SQL с помощью разделителя пакетов - например, «GO» - в список команд SQL, которые выполняются по очереди и т. Д.
...
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
, но я не уверен, что это "лучший" способ.
- Это должно быть быстро
- Он должен обрабатывать большие строки (например, у меня есть несколько скриптов размером 10 МБ)
- Самое сложное (что вышеупомянутый код в настоящее время не делает) - это принять во внимание цитируемый текст
В настоящее время следующий 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 сделает это.
Есть идеи!?