正则表达式,用于检测DDL(创建、更改、删除).sql脚本中隐藏的DML(插入、更新、删除)语句

本文关键字:删除 隐藏 DML 插入 语句 更新 脚本 sql 创建 检测 用于 | 更新日期: 2023-09-27 18:00:06

更新:为了让这个问题更容易。我换了绳子现在,您根本不必担心"开始-结束"。相反,我现在只有GO语句作为终止符。我希望我现在能从其他人那里得到一些答案

我需要编写一个正则表达式,它可以检测DDL脚本(CREATE、ALTER、DROP)中隐藏的DML语句,如INSERT、UPDATE、DELETE。

示例。在下面的脚本中,它应该捕获2删除table5语句和最后一个插入table3的语句。但是它应该忽略插入语句,这些语句实际上在存储过程本身的主体中。

如果您在此处运行此RegEx:http://regexr.com?33rf3,你会看到我已经完成了90%。唯一不起作用的部分是,它在做一场贪婪的比赛,直到最后一次GO。我需要它在第一次出发时停下来。我试过使用+?操作员使其不贪婪,但它不想工作。

delete table5 /*Regex should find this*/
GO
create proc abc
begin
    insert into table1  /*Regex should IGNORE this*/
    begin
        fake nesting here
        insert into table2 /*Regex should IGNORE this*/
    end
end
GO
delete table5 /*Regex should find this*/
GO
alter proc abc2
begin
  --no statements in this proc
end
GO
insert into table3 /*Regex should find this*/

正则表达式,用于检测DDL(创建、更改、删除).sql脚本中隐藏的DML(插入、更新、删除)语句

不需要GO语句。
        var regex1 = new Regex(@"
          (?s)
          (create|alter|drop).+?
          begin
            (?:
               (?> (?! begin | end ) .
                  | begin (?<counter>)
                  | end  (?<-counter>)
                )*
            )
            (?(counter)(?!))
          end
          "
        , RegexOptions.IgnorePatternWhitespace
        );
        var regex2 = new Regex(@"(?:insert|update|delete).+");
        var result = regex2.Matches(regex1.Replace(your_input, ""))
            .Cast<Match>()
            .Select(m => m.Value);

此代码删除所有create/alter/drop语句,然后查找delete/alter/drop。我认为只使用一个正则表达式就可以完成,但这是我现在所能建议的,对不起:)