web-dev-qa-db-ja.com

SQLコードをフォーマットするためのアルゴリズム

SQLコード(SQL Server/MySQL)をフォーマットする(社内で使用する)ツールが必要です。
それを実行するさまざまなサードパーティのツールとオンラインWebサイトがありますが、正確にはどのようにそれが必要かはわかりません。

自分のニーズに合った独自のツールを書きたいと思います。

最初の質問は、SQLコードをどのようにフォーマットするかについて、標準または規約がありますか? (私が試したツールは別の方法でフォーマットしました)

2番目の質問は、このタスクにどのように取り組むべきですか?最初にSQLクエリをツリーのようなデータ構造に変換する必要がありますか?

11
jullins

... 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
2

少し遅れて、これに遭遇しただけです。申し訳ありません。

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

2
Tao