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

C# RegEx解析.sql文件C中DDL中的存储过程和对象名#,c#,regex,parsing,sql-parser,tsql-parser,C#,Regex,Parsing,Sql Parser,Tsql Parser,我有一个.sql文件,其中可能包含多个存储过程的DDL定义、表的alter语句、触发器、视图等 它可以有如下声明: 创建过程/创建过程 ALTER PROC/ALTER PROCEDURE DROP PROC/DROP程序 创建表/触发器/视图 更改表/触发器/视图 删除表/触发器/视图 等 解析.sql文件并仅获取对象列表(Proc/Table/View名称)以及对其执行的操作(ALTER/CREATE/DROP)的最佳方法是什么?我在思考,而不是使用像这样的东西 Microsoft.Da

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

它可以有如下声明:

  • 创建过程/创建过程
  • ALTER PROC/ALTER PROCEDURE
  • DROP PROC/DROP程序
  • 创建表/触发器/视图
  • 更改表/触发器/视图
  • 删除表/触发器/视图
解析.sql文件并仅获取对象列表(Proc/Table/View名称)以及对其执行的操作(ALTER/CREATE/DROP)的最佳方法是什么?我在思考,而不是使用像这样的东西 Microsoft.Data.Schema.ScriptDom或ANTLR或其他解析器,最简单的方法是使用正则表达式。但是我不确定我应该写什么样的正则表达式,它涵盖了所有的场景

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

(创建|更改|删除)\s+(过程|过程|表|触发器|视图|函数|约束)

我的问题是如何获得AdvisorGroups的名称。我的正则表达式也不完美,因为它可能有[dbo]。不管是不是在它前面。它也可能是Alter table ADVISORGOUPS。我并不是在尽力解决所有可能的问题。只是最低限度

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";

Regex-DDL=new-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";

Regex-DDL=new Regex(@)(?您试图通过解析这些语句来完成或获得什么?我们正在创建一个内部工具来启动。SQL将进入生产,而无需DBA手动备份受影响的对象,执行启动,如果出现问题,则手动回滚。因此,此工具将被提供一个.SQL文件,它将解析所有对象名称,获取它们的备份,然后执行.sqlbackup。当你说backup时,你是指对象的模式/定义?还是也指数据。这是针对MS SQL的?如果是,是什么版本?它只是DDL。也就是说,模式没有数据。是的,它是针对MS SQL 2008的。我们使用Red Gate的SQL Compare来管理这类事情,这是商业性的,但是我们发现它物有所值()您试图通过解析这些语句来完成什么或从中获得什么?我们正在创建一个内部工具来启动。SQL将在DBA不手动备份受影响对象的情况下进入生产,执行启动,如果出现问题,则手动回滚。因此,此工具将被提供一个.SQL文件,它将解析所有对象names,做他们的备份,然后执行.sqlbackup。当你说backup时,你是指对象的模式/定义?还是也指数据。这是针对MS SQL的?如果是,是什么版本?它只是DDL。也就是说,模式没有数据。是的,它是针对MS SQL 2008我们使用Red Gate的SQL Compare来管理这类事情,这是商业化的,但我们“我发现它很划算(),如果架构和对象名没有用括号限定怎么办?同意,@db_brad。另外…*如果对象名包含多个embded括号或“.”字符怎么办?*如果架构名不是dbo怎么办?解析SQL对象名很困难。T-SQL提供
parsename()
quotename()
,这使得T-SQL脚本中的过程(相对)简单。但是,我一直无法在
System.Data.SQL*
中,在SMO中,在'NET…nowhere'中找到可用于.NET语言的类似函数,比如C#、VB等。对于将自己的(非常不完整的)SQL“解析器”描述为“令人敬畏的特性”,我投了反对票如果架构和对象名没有用括号限定如何?同意,@db_brad。另外…*如果对象名包含一个以上带符号的括号或“.”字符怎么办?*如果架构名不是dbo怎么办?解析SQL对象名很困难。T-SQL提供了
parsename()
quotename()
这两种方法来完成该过程(相对而言)在T-SQL脚本中很简单。但是,我在SMO中的
System.Data.SQL*
,在“NET…nowhere”中找不到.NET语言(C#、VB等)可用的类似函数。对于将自己的(非常不完整的)SQL“解析器”描述为“令人敬畏的特性”,我投了反对票