作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在开发基于 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);
...
哪种方法有效但容易被 quoted GO statements 之类的东西绊倒或缩进问题。
我认为让这个真正可靠的唯一方法是在应用程序中有一个 SQL 解析器,但我不知道如何去做,或者这是否最终会变得不那么可靠(特别是考虑到这个工具支持多个 DBMS)。
我可以用什么方法解决这个问题?此处的代码示例对我很有帮助。
Relevant sqlHawk code在 github 上。
目前正在使用 jtds执行在脚本中找到的批处理。
最佳答案
GO 是客户端批处理分隔符命令。您可以将其替换为;。它不应在您的 EXEC 动态 SQL 中发送。
USE master
GO --<----- client actually send the first batch to SQL and wait for a response
SELECT * from sys.databases
GO
应该翻译成
Application.Exec("USE master");
Application.Exec("SELECT * from sys.databases");
或者你可以这样写:
Application.Exec("'USE master;SELECT * from sys.databases")
更多关于 GO http://msdn.microsoft.com/en-us/library/ms188037(v=sql.90).aspx
关于java - 如何在 Java/jtds 应用程序中支持 SQL GO 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10734824/
我是一名优秀的程序员,十分优秀!