Algorytm formowania kodu SQL

11

Potrzebuję narzędzia (do użytku domowego), które sformatuje kod SQL (SQL Server / MySQL).
Istnieją różne narzędzia innych firm i strony internetowe, które to robią, ale nie dokładnie tak, jak tego potrzebuję.

Chcę więc napisać własne narzędzie, które będzie pasować do moich potrzeb.

Pierwsze pytanie, czy istnieje jakikolwiek standard lub konwencja dotycząca sposobu formatowania kodu SQL? (narzędzia, które próbowałem sformatować inaczej)

Drugie pytanie, jak mam podejść do tego zadania? Czy najpierw należy przekonwertować kwerendę SQL do jakiejś struktury danych, takiej jak Drzewo?

jullins
źródło

Odpowiedzi:

2

... czy istnieje jakikolwiek standard lub konwencja dotycząca formatowania kodu SQL?

Standard, nr W przypadku analizatora składni SQL można umieścić całą instrukcję SQL w jednym wierszu.

Konwencja, na pewno jest wiele. To zależy, czy próbujesz zmaksymalizować zmienność, czy zminimalizować miejsce. Napisałem formaterery SQL dla obu przypadków.

Właśnie użyłem określonych kombinacji znaków, aby powiedzieć mi, gdzie należy złamać instrukcję SQL.

Oto jeden przykład z napisanego przeze mnie formatera Java SQL SQL . Inny program Java wygenerował kod Java. SQL pochodzi bezpośrednio z 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
Gilbert Le Blanc
źródło
Czy Twój produkt (formatyzator) jest dostępny online lub do pobrania?
jullins
@jullins: Nie. Napisałem to tylko po to, aby udowodnić, że mogę napisać aplikację Java, która zapisuje klasy Java, a także budować SQL z kolumny bazy danych i tabel indeksu (SYSIBM). Niestety nikt, z kim pracuję, nie uznał go za przydatny. Myślę, że mógłbym gdzieś umieścić kod, jeśli chcesz.
Gilbert Le Blanc
Byłbym wdzięczny, chcę tylko zobaczyć część dotyczącą formatowania.
jullins
@jullins: Jestem teraz w pracy, więc nie mam dostępu do publicznych repozytoriów. W ten weekend gdzieś umieszczę kod i dam ci znać, jak uzyskać do niego dostęp.
Gilbert Le Blanc,
co z kodem? Czy możesz to gdzieś umieścić?
jullins
2

Trochę późno, tylko natknąłem się na to, przepraszam.

Program do formatowania T-SQL ubogiego człowieka to formatator T-SQL typu open source (biblioteka, wtyczka ssms, formatator plików wiersza poleceń itp.) - implementacja jest w miarę modularna i wdrożenie tokenizatora i formatera MySQL nie powinno być trudne aby dopasować te z T-SQL (nie zrobiłem tego przede wszystkim dlatego, że nie mam doświadczenia ani nie korzystam z MySQL, więc nie jest to dobre wykorzystanie mojego czasu).

Biblioteka jest zaimplementowana w języku C # (2.0) z licencją AGPL - oznacza to, że nie można rozpowszechniać jej komercyjnie ani ujawniać jako usługi publicznej bez publikowania jakichkolwiek modyfikacji, ale dla użytkownika wewnętrznego nie powinna przedstawiać problemów, czy jest dostosowana czy nie.

Jak już odpowiedział @Gilbert Le Blank, zdecydowanie nie ma standardu formatowania SQL - nawet dostępne tam formaty komercyjne, z różnymi dostępnymi opcjami, nie są zbieżne z tymi samymi ustawieniami domyślnymi lub nawet koniecznie obsługują te same formaty wyjściowe.

Jeśli chodzi o pisanie własnego narzędzia od zera, odradzam go, jeśli potrzebujesz obsługiwać różne przypadki: przynajmniej w przypadku T-SQL, obsługi partii wielu instrukcji SQL z klauzulami CTE WITH, instrukcji MERGE, zapytań podrzędnych i tabele pochodne itp. okazują się dość trudne :)

W przypadku jakiejkolwiek pomocy: http://www.architectshack.com/PoorMansTSqlFormatter.ashx

Tao
źródło