Алгоритм формування SQL-коду


11

Мені потрібен інструмент (для домашнього використання), який буде форматувати код SQL (SQL Server / MySQL).
Існують різні сторонні інструменти та веб-сайти, які роблять це, але не точно, як мені це потрібно.

Тому я хочу написати власний інструмент, який відповідає моїм потребам.

Перше запитання: чи є стандарт чи конвенція щодо форматування коду SQL? (інструменти, які я спробував відформатувати його по-різному)

Друге питання, як я повинен підійти до цього завдання? Потрібно спочатку перетворити запит sql у таку структуру даних, як Дерево?

Відповіді:


2

... чи є стандарт чи конвенція щодо форматування коду SQL?

Стандарт, ні. Ви можете розмістити цілий оператор SQL в одному рядку, що стосується аналізатора SQL.

Конвенція, звичайно, є багато. Це залежить від того, чи намагаєтесь ви досягти максимальної змінності або мінімізувати простір. Я написав формати 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

Ваш продукт (формат) доступний в Інтернеті чи для завантаження?
jullins

@jullins: Ні. Я написав це лише для того, щоб довести, що я можу написати програму Java, яка пише класи Java, а також побудувати SQL з стовпця бази даних та таблиць індексів (SYSIBM). На жаль, ніхто, з ким я працюю, не вважав це корисним. Я думаю, я міг би десь поставити код, якщо хочете.
Гілберт Ле Бланк

Я би вдячний, просто хочу побачити частину форматування.
jullins

@jullins: Зараз я працюю, тому не можу отримати доступ до публічних сховищ. Я поставлю код десь у ці вихідні та повідомляю, як отримати доступ до нього.
Гілберт Ле Бланк

що з кодом? Можете десь покласти його?
jullins

2

Трохи пізно, тільки що наткнувся на це, вибачте.

Форматор T-SQL бідної людини - це формат T-SQL з відкритим кодом (бібліотека, плагін ssms, форматник файлів командного рядка тощо) - реалізація є досить модульною і не повинно бути дуже важким для впровадження токенізатора та форматора MySQL щоб відповідати T-SQL (я цього не робив перш за все тому, що я не маю досвіду або використовую для MySQL зараз, тому це не дуже корисно для мого часу).

Бібліотека реалізована в C # (2.0) з ліцензією AGPL - це означає, що ви не можете комерційно розповсюджувати її або виставляти її як публічну службу, не публікуючи жодних модифікацій, однак для внутрішніх користувачів вона не повинна створювати жодних проблем, незалежно від того, чи вона налаштована чи ні.

Як вже відповів @Gilbert Le Blank, стандартів форматування SQL напевно немає - навіть комерційні формати, які існують там, з різними опціями, які вони надають, не конвергуються за тими ж типовими настройками або навіть обов'язково підтримують однакові вихідні формати.

Що стосується написання власного інструменту з нуля, я б радив цього не застосовувати, якщо вам потрібно обробляти різні випадки: принаймні для T-SQL, обробку пакетів SQL з кількома операторами із пунктами CTE AND, заяви MERGE, підзапити та отримані таблиці тощо виявляються досить важкими :)

У випадку, якщо це допоможе: http://www.architectshack.com/PoorMansTSqlFormatter.ashx

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.