RegEx для анализа хранимых процедур и имен объектов из DDL в файле.sql C#
У меня есть файл.sql, который может содержать определения DDL нескольких хранимых процедур, инструкции alter для таблиц, триггеров, представлений и т. Д.
Это могут быть такие заявления:
- СОЗДАТЬ ПРОЦЕСС / СОЗДАТЬ ПРОЦЕДУРУ
- ALTER PROC / ALTER PROCEDURE
- DROP PROC / DROP PROCEDURE
- СОЗДАТЬ СТОЛ / ТРИГГЕР / ВИД
- ALTER TABLE/TRIGGER/VIEW
- DROP TABLE/TRIGGER/VIEW
- так далее
Каков наилучший способ анализа файла.sql и получения списка объектов (имена Proc/Table/View) и действий, которые над ними выполняются (ALTER/CREATE/DROP)? Я думаю, что вместо того, чтобы использовать такие вещи, как Microsoft.Data.Schema.ScriptDom или ANTLR или другие парсеры, проще всего использовать RegEx. Но не уверен, какой RegEx я должен написать, который охватывает все сценарии.
Пока что это выражение может соответствовать всем вышеперечисленным правилам. Но как мне получить название объекта перед ним. например. это соответствует
(Создать | изменить | падение)\s+(процедура | прок | таблица | триггер | вид | функции | ограничение)
Как мне получить название AdvisorGroups - это мой вопрос. Мой RegEx также несовершенен, потому что он может иметь [dbo]. перед этим или нет. Это может быть просто Alter table AdvisorGroups. Я не пытаюсь заботиться обо всех возможностях. Просто самый минимум.
ALTER TABLE [dbo]. [AdvisorGroups] ДОБАВИТЬ ОГРАНИЧЕНИЕ [XXX]
-Заранее спасибо
2 ответа
Я решил это сам. Надеюсь, это поможет кому-то. Таким образом, для строки, содержащей беспорядок ALTER, DROP, CREATE PROC/TABLE/TRIGGER/FUNCTION
Regex DDL = new Regex(@"(?<=\b(create|alter|drop)\s+(procedure|proc|table|trigger|view|function)\b\s\[dbo\].)\[.*?\]", RegexOptions.IgnoreCase);
Match match = DDL.Match(inputScript);
while(match.Success)
{
textBox2.Text += "\r\n" + match.Groups[1].Value + " - " + match.Groups[2].Value + " - " + match.Value;
match = match.NextMatch();
}
textBox3.Text = "DONE";
Вы получите вывод, как это.
- СОЗДАТЬ - ПОСМОТРЕТЬ - vwEmployees
- CREATE - TABLE - tblSalaries
- DROP - PROC - spGetEmployees
- ALTER - TABLE - tblSalaries
Удивительный смысл этого кода в том, что он не только дает вам объект, на который влияют, но даже дает вам тип объекта (например, таблица, proc, view) и какую операцию (например, create/alter/drop). Все это доступно в матчах [1], матчах [2] и т. Д.
RegEx не выполнит свою работу - определенно... вам понадобится настоящий парсер - такой, как этот (коммерческий).