Algoritma untuk memformat kode SQL


11

Saya membutuhkan alat (untuk penggunaan di rumah) yang akan memformat kode SQL (SQL Server / MySQL).
Ada berbagai alat pihak ke-3 dan situs web online yang melakukannya tetapi tidak persis bagaimana saya membutuhkannya.

Jadi saya ingin menulis alat sendiri yang sesuai dengan kebutuhan saya.

Pertanyaan pertama apakah ada standar atau konvensi untuk bagaimana kode SQL harus diformat? (alat yang saya coba format berbeda)

Pertanyaan kedua, bagaimana saya harus mendekati tugas ini? Haruskah pada awalnya mengkonversi permintaan sql menjadi beberapa struktur data seperti Tree?

Jawaban:


2

... adakah standar atau konvensi untuk bagaimana kode SQL harus diformat?

Standar, tidak. Anda bisa meletakkan seluruh pernyataan SQL pada satu baris sejauh menyangkut parser SQL.

Konvensi, tentu ada banyak. Itu tergantung apakah Anda mencoba memaksimalkan perubahan atau meminimalkan ruang. Saya telah menulis formatters SQL untuk kedua kasus.

Saya hanya menggunakan kombinasi karakter tertentu untuk memberi tahu saya di mana saya harus memecahkan pernyataan SQL.

Berikut adalah satu contoh dari formatter Java DB2 SQL yang saya tulis. Program Java lainnya menghasilkan kode Java. SQL datang langsung dari SYSIBMtabel.

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

Apakah produk Anda (pemformat) tersedia secara online atau untuk diunduh?
jullins

@ jullins: Tidak. Saya menulisnya hanya untuk membuktikan bahwa saya bisa menulis aplikasi Java yang menulis kelas Java, serta membangun SQL dari kolom basis data dan tabel indeks (SYSIBM). Sayangnya, tidak ada seorang pun yang bekerja dengan saya yang menganggapnya berguna. Saya kira saya bisa meletakkan kode di suatu tempat jika Anda mau.
Gilbert Le Blanc

Saya akan sangat menghargainya, saya hanya ingin melihat bagian pemformatan.
jullins

@ jullins: Saya sedang bekerja sekarang, jadi saya tidak bisa mengakses repositori publik. Saya akan meletakkan kode di suatu tempat akhir pekan ini, dan memberi tahu Anda cara mengaksesnya.
Gilbert Le Blanc

bagaimana dengan kodenya? Bisakah Anda letakkan di suatu tempat?
jullins

2

Sedikit terlambat, baru saja menemukan ini, maaf.

Poor Man's T-SQL Formatter adalah open-source formatter T-SQL (library, ssms plugin, command-line file formatter, dll) - implementasinya cukup modular dan seharusnya tidak terlalu sulit untuk mengimplementasikan tokenizer dan formatter MySQL. untuk mencocokkan yang T-SQL (saya belum melakukannya terutama karena saya tidak memiliki pengalaman atau penggunaan untuk MySQL sekarang, jadi ini bukan penggunaan waktu saya yang baik).

Perpustakaan diimplementasikan dalam C # (2.0) dengan lisensi AGPL - yang berarti Anda tidak dapat mendistribusikannya kembali secara komersial atau mengekspos sebagai layanan publik tanpa menerbitkan modifikasi apa pun, tetapi untuk pengguna dalam-rumah itu tidak akan menimbulkan masalah, apakah itu disesuaikan atau tidak.

Sebagai @Gilbert Le Blank sudah menjawab, pasti tidak ada standar pada pemformatan SQL - bahkan pemformat komersial di luar sana, dengan berbagai opsi yang mereka berikan, jangan konvergen pada default yang sama atau bahkan perlu mendukung format output yang sama.

Sehubungan dengan menulis alat Anda sendiri dari awal, saya akan menyarankan untuk tidak melakukannya jika Anda perlu menangani berbagai kasus: setidaknya untuk T-SQL, menangani batch multi-pernyataan SQL dengan klausa CTE WITH, klausa pernyataan MERGE, sub-query dan tabel turunan, dll ternyata cukup sulit :)

Seandainya ada bantuan: http://www.architectshack.com/PoorMansTSqlFormatter.ashx

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.