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


11

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

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

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

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

回答:


2

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

製品(フォーマッター)はオンラインまたはダウンロードできますか?
ジュリン11/10/14

@jullins:いいえ。私は、Javaクラスを書き込むJavaアプリケーションを作成できること、およびデータベースの列とインデックステーブル(SYSIBM)からSQLを構築できることを証明するためにのみ作成しました。悲しいことに、私が一緒に仕事をしている人は誰もそれが役に立たないと思っています。必要に応じて、コードをどこかに置くことができると思います。
Gilbert Le Blanc

私はそれを感謝します、私はフォーマットの部分を見たいだけです。
ジュリン

@jullins:私は仕事中なので、公開リポジトリにアクセスできません。コードを今週末どこかに配置し、アクセス方法をお知らせします。
Gilbert Le Blanc

コードはどうですか?どこかに置けますか?
ジュリン

2

少し遅れて、これに遭遇しただけです。

Poor ManのT-SQLフォーマッタはオープンソースのT-SQLフォーマッタ(ライブラリ、ssmsプラグイン、コマンドラインファイルフォーマッタなど)です-実装は適度にモジュール化されており、MySQLトークナイザとフォーマッタの実装はそれほど難しくありません。 T-SQLと一致させる(現在、MySQLを使用したことがないか、MySQLを使用していないため、時間を十分に活用していないので、私は主にそうしていません)。

ライブラリはAGPLライセンスでC#(2.0)に実装されています。つまり、変更を公開せずに商用に再配布したり、公共サービスとして公開したりすることはできませんが、社内ユーザーの場合、カスタマイズされているかどうかにかかわらず、問題は発生しません。ない。

@Gilbert Le Blankがすでに回答したように、SQLフォーマッティングには標準がありません。さまざまなオプションを提供する市販のフォーマッターでさえ、同じデフォルトに収束したり、必ずしも同じ出力フォーマットをサポートしたりすることはありません。

独自のツールを最初から作成する場合、さまざまなケースを処理する必要がある場合は、少なくともT-SQLの場合、CTE WITH句を使用したSQLマルチステートメントバッチの処理、MERGEステートメント、サブクエリ、および派生テーブルなどはかなり難しいことがわかります:)

それが何らかの助けである場合:http : //www.architectshack.com/PoorMansTSqlFormatter.ashx

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.