【发布时间】:2013-02-19 21:12:35
【问题描述】:
更新:为了让这个问题更容易。我已经改变了字符串和 现在您根本不必担心 BEGIN END。相反,我现在只有 GO 语句 终结者。我希望我现在能从其他人那里得到一些答案
我需要编写一个正则表达式来检测隐藏的 DML 语句,如 DDL 脚本(CREATE、ALTER、DROP)中的 INSERT、UPDATE、DELETE。
示例。在下面的脚本中,它应该捕获 2 个 delete table5 语句和最后一个 insert into table3 语句。但它应该忽略实际上在存储过程本身的主体中的插入语句。
如果你在这里运行这个 RegEx:http://regexr.com?33rf3,你会看到我已经完成了 90%。唯一不起作用的部分是它正在进行贪婪匹配,直到最后一个 GO。我需要它在第一次 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*/
【问题讨论】:
-
由于嵌套括号(开始/结束),在这种情况下只能使用 .NET 正则表达式实现。另一种选择是假设它将是开始/结束的有限嵌套
-
幸运的是我使用的是 C#。任何想法正则表达式会是什么样子?您还可以假设它是否简单,没有开始结束......并且所有语句都以 GO 结束
-
我认为你找错树了。如果你让它与正则表达式一起使用,我会感到惊讶。 stackoverflow.com/questions/133601/…
-
如果您不信任您的脚本,那么您不应该运行它们,或者您应该从不会造成任何损害的帐户运行它们。
-
@John Saunders - 在不知道我这样做的背景的情况下,您添加该评论是不公平的。这样做有一个非常充分的理由,我在这里无法解释。 stackexchange 是为了提出技术问题,而不是提供背后的商业原因。而且我认为我在问题中提供了足够的信息,以便人们能够回答。
标签: c# .net regex sql-parser tsql-parser