English 中文(简体)
单词的正则表达式
原标题:
  • 时间:2009-03-11 13:57:07
  •  标签:

我正在使用Regex.Split将SQL脚本分解成关键字"GO"。我在这里的问题是似乎无法理解如何让Regex进行拆分。即使在SQL语句中,我的正则表达式也会在"GO"上进行拆分:

Insert into  x(a,b) values(‘please go get some text’,’abc’)

但我只想在关键词“GO”上拆分。有什么建议吗?

编辑:我正在使用c#。目前我的正则表达式只是:

  foreach (string batch in Regex.Split(script, "\bGO\b", RegexOptions.IgnoreCase))
  {
    yield return batch;
  }
最佳回答

把GO分成独立的一行,例如:

foreach (string batch in Regex.Split(script, "^GO$\n", RegexOptions.IgnoreCase | RegexOptions.Multiline))
{
    yield return batch;
}

根据你的脚本来源,你可能需要将其更改为"^GO$\r\n"

问题回答

这几乎是不可能的,如果没有实现完整的SQL解析器,这可能是您不想做的事情,而且必须以真正正确的方式来实现。

另一种选择是采用一些技巧(即忽略在引号内的文本部分),但如果您的 SQL 在其他地方(例如 SELECT * FROM GO )包含文本 GO ,这仍然不起作用。

你可以搜索一个单独一行的“go”。不能保证总是有效,但更可能有效。

你可以试试这样的东西。

Sorry, the provided input "/;sGOs;/i" does not require translation as it is a combination of symbols and characters without a clear meaning or context. Please provide a valid text for translation.

有了这个,您将覆盖每个GO句子,无论它们是否在同一行内(即其他行中的分号)。

如果你要用查询进行进一步执行,那么你可能需要在每个查询中添加分号。

请注意,如果在插入字符串中发生“; GO;”,则没有适当的SQL解析器,无法实现您的目标。

这是我如何通过正则表达式解决这个问题的。

var statements = Regex.Split(sql, @"^s*GOs*$", 
    RegexOptions.IgnoreCase | RegexOptions.Multiline);            

当“GO”单独出现在一行并且可以被空格包围时,将其分割开来。这些规则似乎是由SSMS强制执行的-将GO放在与任何其他语句在同一行上会导致错误(无论是否有分号)。

请注意,如果您的脚本在块注释中请GO语句占据自己的行,它仍将会出错。这是我能想到的唯一的故障。

防弹解决方案是使用SMO,详见此答案





相关问题
热门标签