0

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

它可能有这样的陈述:

  • 创建过程/创建过程
  • 改变程序/改变程序
  • 丢弃过程/丢弃过程
  • 创建表/触发器/视图
  • 更改表/触发器/视图
  • 拖放表/触发器/视图
  • ETC

解析 .sql 文件并获取对象列表(Proc/Table/View 名称)以及对它们执行的操作(ALTER/CREATE/DROP)的最佳方法是什么?我想代替使用 Microsoft.Data.Schema.ScriptDom 或 ANTLR 或其他解析器之类的东西,最简单的方法是使用 RegEx。但不确定我应该写什么样的正则表达式来涵盖所有场景。

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

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

如何获得 AdvisorGroups 的名称是我的问题。我的 RegEx 也不完美,因为它可能有 [dbo]。在它面前与否。它也可能只是 Alter table AdvisorGroups。我并不是要照顾所有的可能性。只是最低限度。

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

-提前致谢

4

2 回答 2

3

RegEx 无法完成工作 - 绝对......您将需要一个真正的解析器 - 就像这个(商业)一样。

于 2013-02-15T21:49:03.517 回答
1

我自己解决了。希望它可以帮助某人。所以对于一个包含 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
  • 创建 - 表 - tblSalaries
  • DROP - PROC - spGetEmployees
  • ALTER - 表 - tblSalaries

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

于 2013-02-15T23:30:08.210 回答