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肯定不会完成任务。。。您将需要一个真正的解析器,比如这个(商业)解析器。
我自己解决了。希望它能帮助到别人。因此,对于包含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]等中使用。