SQLコード(SQL Server/MySQL)をフォーマットする(社内で使用する)ツールが必要です。
それを実行するさまざまなサードパーティのツールとオンラインWebサイトがありますが、正確にはどのようにそれが必要かはわかりません。
自分のニーズに合った独自のツールを書きたいと思います。
最初の質問は、SQLコードをどのようにフォーマットするかについて、標準または規約がありますか? (私が試したツールは別の方法でフォーマットしました)
2番目の質問は、このタスクにどのように取り組むべきですか?最初にSQLクエリをツリーのようなデータ構造に変換する必要がありますか?
... SQLコードのフォーマット方法に関する標準または規約はありますか?
標準、いいえ。 SQLパーサーに関する限り、SQLステートメント全体を1行に置くことができます。
大会、確かにたくさんあります。変更可能性を最大化しようとしているのか、スペースを最小化しようとしているのかによって異なります。どちらの場合もSQLフォーマッターを作成しました。
特定の文字の組み合わせを使用して、SQLステートメントをどこで中断するかを指示しました。
以下は、私が書いた Java DB2 SQLフォーマッター の例です。別のJavaプログラムがJavaコードを生成しました。SQLはSYSIBM
テーブルから直接取得されました。
protected void prepareIndex00Select(String codeFacl)
throws SQLException {
StringBuffer sb = new StringBuffer();
sb.append("SELECT CODE_FACL, SEQ_FACL, FILLER_TOF ");
sb.append(" , CODE_TOF, NAME_FACL, NAME_LENGTH ");
sb.append(" , CODE_FMB, ID_NCIC_ORI, NBR_PRINTER_PREFIX ");
sb.append(" , ID_PERSONNEL_OFC, COMPLEX_CODE ");
sb.append(" , PHS_CODE, DESIG_FACL_GRP, IND_DESIG_AUTH ");
sb.append(" , CODE_FACL_I_T, INTKEY_FACL, IND_CDM_SENTENCING ");
sb.append(" , MAL_FEM_IND, DEL_AFTER, IND_INMATES ");
sb.append(" , VALUE_SO_CPU_STD, VALUE_SO_CPU_DAY ");
sb.append(" , CODE_CAT, VALUE_DCN, XIDBKEY ");
sb.append(" , FACL_FK_REGN ");
sb.append(" FROM ");
sb.append(creator);
sb.append(".FACL ");
sb.append(" WHERE CODE_FACL = ? ");
if (additionalSQL != null) sb.append(additionalSQL);
psIndex00 = connection.prepareStatement(sb.toString());
psIndex00.setString(1, codeFacl);
} // End prepareIndex00Select method
少し遅れて、これに遭遇しただけです。申し訳ありません。
Poor ManのT-SQLフォーマッタはオープンソースのT-SQLフォーマッタ(ライブラリ、ssmsプラグイン、コマンドラインファイルフォーマッタなど)です-実装は適度にモジュール化されており、MySQLトークナイザとフォーマッタの実装はそれほど難しくありません。 T-SQLと一致させる(MySQLの経験がない、または使用していないため、私は主にそうしていません。したがって、私の時間を有効に利用していません)。
ライブラリはAGPLライセンスでC#(2.0)に実装されています。つまり、変更を公開せずに商用に再配布したり、公共サービスとして公開したりすることはできませんが、社内ユーザーの場合、カスタマイズされているかどうかにかかわらず、問題は発生しません。ない。
@Gilbert Le Blankがすでに回答したように、SQLの書式設定には標準がありません。市販のフォーマッタであっても、それらが提供するさまざまなオプションによって、同じデフォルトに収束したり、必ずしも同じ出力形式をサポートしたりすることはありません。
独自のツールを一から作成することに関して、少なくともT-SQLの場合、CTE WITH句を使用したSQLマルチステートメントバッチの処理、MERGEステートメント、サブクエリ、および派生テーブルなどはかなり難しいことがわかります:)
それが何らかの助けである場合: http://www.architectshack.com/PoorMansTSqlFormatter.ashx