3

我们有一个更新程序应用程序,它在 SQL Server 数据库上执行超过 30,000 行代码的 SQL 脚本。在这个脚本中有大量的GO语句。我习惯使用的 ADO 组件不支持该GO语句。我们OSQL在更新服务器时总是使用命令行,这很难发现问题(输出一个文本文件,然后我们必须对其进行解析以查找错误和结果)。GO如果 Delphi 中的某些东西能够找到这些语句并一次执行每个块,那就更理想了。

我确实了解该GO语句特定于能够执行它们的 MS 工具。同样,该脚本有超过 30,000 行代码,至少包含 500 条GO语句。我们在 SQL Management Studio 和 OSQL 中为更新程序使用相同的脚本。但是 OSQL 并没有为我们提供我们需要的结果 - 它是执行此类脚本的一种草率方式。

Delphi 是否有任何现有的 SQL Server 兼容工具可以识别GO语句?我不是在谈论解析器(尽管我确信会涉及解析),我在谈论一个现成的实用程序来执行包含GO语句并返回每个脚本块的结果的 SQL 脚本。

例如,一个块可能会创建一个表,然后GO, 然后为该表创建一个存储过程,另一个GO. 代码是如此复杂,以至于在像这个问题这样的代码中实现它是完全不可能的。

更新

我已经成功编写了一小段工作代码来执行此操作,但是它没有考虑GO注释块中的语句。

代码在这里找到

我没有在这个问题上进一步询问,只是想我会分享我在哪里。

4

2 回答 2

4

将脚本加载到 aTStringList中会起作用。单独查找一行上的单词GO(避免包含 的嵌入文本GO)作为每个块的结尾或脚本本身。

您使用GO行的索引 - 1 标记前一个块的结束,并使用GO行索引 + 1 作为下一个块的开始。如果GO索引等于 StringList.Count - 1,那么您已经到达脚本的末尾。您可以在处理块之前启动事务,并在引发异常时回滚该事务。

于 2013-08-08T01:53:02.703 回答
2

这实际上是一个很好的问题,没有简单的答案。

值得强调的是,这是 Microsoft 的问题,而不是 SQL,也不是 Delphi。

这已在 SO 上多次讨论过,但没有“一刀切”的答案:

我的两个主要建议:

  • 读取脚本文件,一次解析一行,然后在每行只包含“go”之后运行“execute”

  • 使用您的脚本和登录参数执行 SqlCmd.exe 的 ShellExecute()(或等效项)。

于 2013-08-08T01:00:37.070 回答