7

我正在开发一个基于 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执行脚本中的批处理。

4

2 回答 2

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

应该翻译成

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

于 2012-05-28T19:40:36.470 回答
1

好的,所以这不会完全是您想要的,但您可能会发现它是一个开始。我在这里将 SchemaEngine(它构成了我的大部分产品的核心)作为开源发布。在那里,您会发现 C# 代码可以非常可靠地执行您想要的操作(即不会被字符串、注释等绊倒)。它还支持 'GO x' 语法来重复批次 x 次。

如果你下载它并查看一下,/Atlantis.SchemaEngine/Helpers你会发现一个名为的类BatchParser.cs,其中包含一个名为的方法ParseBatches——它的作用与它在锡上所说的差不多。

于 2012-06-03T21:15:10.720 回答