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 не выполнит свою работу - определенно... вам понадобится настоящий парсер - такой, как этот (коммерческий).

Другие вопросы по тегам