C# RegEx解析.sql文件C中DDL中的存储过程和对象名#
我有一个.sql文件,其中可能包含多个存储过程的DDL定义、表的alter语句、触发器、视图等 它可以有如下声明: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
- 创建过程/创建过程
- ALTER PROC/ALTER PROCEDURE
- DROP PROC/DROP程序
- 创建表/触发器/视图
- 更改表/触发器/视图
- 删除表/触发器/视图
- 等
-提前感谢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“解析器”描述为“令人敬畏的特性”,我投了反对票