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

时间:2012-02-23 17:22:21

标签: c# regex tsql

我正在尝试解析一个包含创建函数和存储过程等命令的大型SQL脚本。我想在每次找到GO语句时将文件拆分为字符串(我想使用普通的ado.net而不是SMO来执行它)。

问题是到目前为止我还没有找到合适的正则表达式。使用简单的 \bGO\b 忽略大小写会将其拆分。但是也会将评论中的所有内容分开,如

- 这个也将被拆分

使用这个表达式 ^\bGO\b[^--]$ 几乎可以解决我的问题,但是当我连续两次执行GO时会出现一些错误(无论出于何种原因,我的域名都在后面)。

end
go 
GO 

这就是我的脚本中SP创建结束的样子。

我在C#

中这样做

非常感谢

** 编辑 **

一位同事想出了一个解决方案,暂时适用于我的所有脚本

^\s*go\s*\r\n

4 个答案:

答案 0 :(得分:3)

你可以试试这个:

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

意思是,如果前面没有两个或更多的破折号,后面跟着任何东西,请输入字符串

这应该可以解决问题!

已修改为仅强制检查字边界

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

PS:如果你没有找到this是关于RE的好资源。

PS2:This is a great tool用于RE创作/测试

答案 1 :(得分:3)

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

答案 2 :(得分: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  

答案 3 :(得分:0)

在没有正则表达式的情况下处理这最后一种情况可能更容易。

分割脚本后,删除String.IsNullOrWhitespace(part) == true

的部分