正则表达式,用于检测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*/
不需要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。我认为只使用一个正则表达式就可以完成,但这是我现在所能建议的,对不起:)