我正在开发一个基于 Java 的 OSS 应用程序SqlHawk,它的功能之一是针对服务器运行升级 sql 脚本。
Microsoft 已经制定了使用GO语句将脚本拆分为批次的惯例,这是一个好主意,但只是要求字符串上的错误匹配。
目前我有一个非常基本的:
// split where GO on its own on a line
Pattern batchSplitter = Pattern.compile("^GO", Pattern.MULTILINE);
...
String[] splitSql = batchSplitter.split(definition);
...
哪种方法有效,但容易被引用的 GO 语句或缩进问题之类的事情绊倒。
我认为使这个真正可靠的唯一方法是在应用程序中有一个 SQL 解析器,但我不知道如何去做,或者这是否最终会变得不那么可靠(特别是考虑到这个工具支持多个 DBMS) .
我有什么方法可以解决这个问题?代码示例在这里对我很有帮助。
github上的相关sqlHawk代码。
目前使用jtds执行脚本中的批处理。