我们有一个更新程序应用程序,它在SQL Server数据库上执行超过30,000行代码的SQL脚本。在此脚本中有大量GO
语句。我习惯使用的ADO组件不支持GO
语句。我们在更新服务器时总是使用OSQL
命令行,这很难解决问题(输出一个文本文件然后我们必须解析以查找错误和结果)。如果Delphi中的某些东西能够找到那些GO
语句并一次执行每个块,那将会更加理想。
我确实理解GO
语句特定于能够执行它们的MS工具。脚本再次超过30,000行代码,至少有500 GO
个语句。我们在SQL Management Studio和OSQL中使用相同的脚本作为更新程序。但OSQL并没有给我们提供我们需要的结果 - 这是执行这样一个脚本的一种草率方式。
Delphi是否存在可识别GO
语句的现有SQL Server兼容工具?我不是说一个解析器(虽然我肯定会涉及解析),我说的是一个现成的实用程序来执行包含GO
语句的SQL脚本并返回每个脚本的结果块。
例如,一个块可能会创建一个表,然后创建GO
,然后为该表和另一个GO
创建一个存储过程。代码非常复杂,在像this question这样的代码中实现它是完全不可能的。
更新
我已经成功编写了一小部分工作代码来执行此操作,但是它没有考虑注释块中的GO
语句。
我不会在这个问题上再问任何问题,只是想我会分享这个问题。
答案 0 :(得分:4)
将脚本加载到TStringList
会有效。在一行上查找单词GO
(避免包含GO
的嵌入文本)作为每个块的结尾或脚本本身。
使用GO
行的索引 - 1来标记前一个块的结尾,并使用GO
行索引+ 1作为下一个块的开头。如果GO
索引等于StringList.Count - 1,那么您已到达脚本的末尾。您可以在处理块之前启动事务,并在引发异常时回滚该事务。
答案 1 :(得分:2)
这实际上是一个很好的问题,没有简单的答案。
值得强调的是,这是一个Microsoft问题,而不是SQL,也没有Delphi。
这已在SO上多次讨论,但没有“一刀切”的答案:
我的两个主要建议:
阅读脚本文件,一次解析一行,并在每行只包含“go”之后运行“执行”
使用脚本和登录参数执行SqlCmd.exe的ShellExecute()(或等效命令)。