如何在Java/jtds应用程序中支持SQL GO语句?

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);
...
Run Code Online (Sandbox Code Playgroud)

哪种工作,但很容易被引用的GO语句或缩进问题绊倒.

我认为让这个真正可靠的唯一方法是在应用程序中有一个SQL解析器,但我不知道如何解决这个问题,或者这实际上是否真的不太可靠(特别是考虑到这个工具支持多个DBMS) .

我有什么方法可以解决这个问题?代码示例对我来说非常有帮助.

github上的相关sqlHawk代码.

目前使用jtds来执行脚本中的批处理.

Pol*_*usB 1

GO 是客户端批处理分隔符命令。您可以将其替换为;。它不应该在您的 EXEC 动态 SQL 中发送。

USE master
GO --<----- client actually send the first batch to SQL and wait for a response
SELECT * from sys.databases
GO
Run Code Online (Sandbox Code Playgroud)

应该翻译成

Application.Exec("USE master");
Application.Exec("SELECT * from sys.databases");
Run Code Online (Sandbox Code Playgroud)

或者你可以这样写:

Application.Exec("'USE master;SELECT * from sys.databases")
Run Code Online (Sandbox Code Playgroud)

有关 GO 的更多信息 http://msdn.microsoft.com/en-us/library/ms188037(v=sql.90).aspx