7

私は Java ベースの OSS アプリSqlHawkに取り組んでいます。これは、その機能の 1 つとして、サーバーに対してアップグレード 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# コードがあります (つまり、文字列やコメントなどでつまずくことはありません)。また、バッチを x 回繰り返す 'GO x' 構文もサポートしています。

それをダウンロードして調べてみると、という名前のメソッドを含むという/Atlantis.SchemaEngine/Helpers名前のクラスが見つかります。BatchParser.csParseBatches

于 2012-06-03T21:15:10.720 に答える