Tim*_*ell 6 java t-sql sql-server jtds
我正在开发一个基于Java的OSS应用程序SqlHawk,它的一个功能是对服务器运行升级sql脚本.
微软已经将使用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来执行脚本中的批处理.
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