使用正则表达式从 SQL 脚本文件中删除所有的 GO。

7
我正在尝试解析一个大型SQL脚本,其中包含诸如创建函数和存储过程的命令。我想在找到GO语句时将文件拆分为字符串(我想使用普通ado.net执行它,而不是SMO)。
问题是我迄今为止还没有找到合适的正则表达式。使用简单的\bGO\b忽略大小写会将其拆分。但也会拆分注释中的所有go(s),例如:
-- 这个go也会被拆分
使用这个表达式^\bGO\b[^--]$几乎解决了我的问题,但当我有两个连续的GO时(由于某种原因存在并且在我的领域之后),我会得到一些错误。
end
go 
GO 

这是我的脚本中SP创建的结尾,使用C#编写。非常感谢。
**编辑**
我的同事提出了一种解决方案,目前适用于我所有的脚本: ^\s*go\s*\r\n

我们需要更多的信息才能为您提供一个“全能”的正则表达式模式。一般来说,我会为此设置一个“沙盒”单元测试;设置一个包含GO模式的文字,然后对每个模式应用一个“候选”正则表达式算法,并断言生成的文本是否符合您的要求。在给定您特定的正则表达式的情况下,通过或失败的测试应该是修改正则表达式的线索。如果您提供更多的模式示例,无论是想要删除还是不想删除,这将有助于我们帮助您。 - KeithS
@Andres 有点偏题:**^\bGO\b[^--]$** 真的有效吗,还是有错别字?我认为你可能想要避免在 GO 前面而不是后面使用 -- - Cristian Lupascu
@KeithS 很难举例,因为这将适用于创建存储过程、函数和视图的所有数据库源。但基本上它是一个可以非常多样化的 SQL 文件源。例如,我遇到了一些问题,比如在 /* ... */ 之间的注释代码,以及行注释中的 'go' 动词,比如 -- this should go ... - Andres
5个回答

4

你可以尝试这样做:

(?i-msnx:\b(?<!-{2,}.*)go[^a-zA-Z])

如果字符串前面没有2个或更多破折号,后面跟着任何内容,则匹配字符串go

这应该就可以了!

编辑以强制在单词边界处检查

编辑以忽略后面跟着字母/数字的'go'(最后一次尝试 :))并添加正则表达式工具链接

PS:如果您还没有找到这个是关于RE的伟大资源。

PS2:这是一个很棒的用于RE编写/测试的工具。


感谢Adriano,但是正则表达式在这样的地方失败了:GRANT ALL ON C_MAIL_CAT_CONV_TYPES TO IPSAdmins GRANT ALL ON C_MAIL_CATEGORIES TO IPSAdmins我得到了GRANT ALL ON C_MAIL_CAT_CONV_TYPES TO IPSAdmins GRANT ALL ON C_MAIL_CATE - Andres
我知道这个网站,就像我们的朋友Reginaldo经常说的那样,“对自己做一个好事,学习正则表达式” :-) - Andres
几乎可以,但无法处理以下代码(它将nago.OPERATOR_CD的go解释为go:laa.PERIOD_CD as [AccPeriodType], nago.OPERATOR_CD as [Partner], OFFICE_FCD as [PartnerOffice], - Andres

3

你可能已经听说过,“有些人在面对问题时会想到‘我知道,我可以使用正则表达式’。现在他们有两个问题。” 如果性能不是你更关心的问题,你可以简单地检查修剪后的行是否等于“go”,忽略大小写。你不需要花费更多时间处理正则表达式。


1

我知道这是一个非常老的问题,但希望这能帮助其他人。

这是我使用的正则表达式:

(^(go)[\s,;])|(^(go)$)|(;go)|(;)\s*(go)

我还没有成功地破解它。

这是我使用的测试用例:

use SCRATCH  
GO;  
--go  
set nocount ON ;go;  
go  
' go '   
'go'  
'go  
go'  
create table gonogo ( go int null, nogo int null)   
GO  

insert INTO mungbean VALUES (1); go  
GO  
;  
select * from mungbean  
go  

 go  
 go;  
 '  
go  

我也是直到今天才知道。前往某个锚点。 - Boris Callens

0

0

如果不使用正则表达式,处理最后一种情况可能会更容易。

在拆分脚本后,删除 String.IsNullOrWhitespace(part) == true 的部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接