RegEx从.sql文件C#中的DDL解析存储过程和对象名称

本文关键字:存储过程 对象 DDL sql 文件 中的 RegEx | 更新日期: 2023-09-27 17:59:49

我有一个.sql文件,其中可能包含几个存储过程的DDL定义,以及表、触发器、视图等的alter语句

它可以有这样的声明:

  • CREATE PROC/CREATE过程
  • ALTER PROC/ALTER PROCEDURE
  • 丢弃过程
  • 创建表/触发器/视图
  • 更改表/触发器/视图
  • 删除表/触发器/视图
  • 等等

解析.sql文件并只获取对象列表(Proc/Table/View名称)以及对其执行的操作(ALTER/CREATE/DROP)的最佳方法是什么?我在想,而不是用这样的东西微软数据架构。ScriptDom或ANTLR或其他解析器,最简单的方法是使用RegEx。但不确定我应该写什么样的RegEx,涵盖所有场景。

到目前为止,这个表达式能够匹配上述所有规则。但是我该如何获得前面对象的名称呢?例如,它与匹配

(create|alter|drop)''s+(procedure|proc|table|trigger|view|function|constraint)

我的问题是如何获得AdvisorGroups这个名称。我的RegEx也不完美,因为它可能有dbo。不管是否在它前面。它也可能只是Alter表AdvisorGroups。我并没有尽力去处理所有可能的事情。只是最低限度。

ALTER TABLE[dbo]。[AdvisorGroups]添加约束[XXX]

-提前感谢

RegEx从.sql文件C#中的DDL解析存储过程和对象名称

RegEx肯定不会完成任务。。。您将需要一个真正的解析器,比如这个(商业)解析器。

我自己解决了。希望它能帮助到别人。因此,对于包含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";

你会得到这样的输出。

  • CREATE-VIEW-vwEmployees
  • CREATE-TABLE-tbl工资
  • DROP-PROC-spGetEmployees
  • ALTER-TABLE-tbl工资

这段代码的奇妙之处在于,它不仅为您提供了受影响的对象,而且还为您提供对象的类型(即表、进程、视图)和操作(例如创建/更改/删除)。所有这些都可以在匹配[1]、匹配[2]等中使用。