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

11

Мне нужен инструмент (для внутреннего использования), который будет форматировать код SQL (SQL Server / MySQL).
Существуют различные сторонние инструменты и веб-сайты, которые делают это, но не совсем так, как мне это нужно.

Поэтому я хочу написать свой собственный инструмент, который будет соответствовать моим потребностям.

Первый вопрос: существует ли какой-либо стандарт или соглашение о том, как код SQL должен быть отформатирован? (инструменты, которые я пробовал, форматируют это по-другому)

Второй вопрос, как мне подойти к этой задаче? Должны ли сначала преобразовать SQL-запрос в какую-то структуру данных, например, в Tree?

jullins
источник

Ответы:

2

... есть ли какой-либо стандарт или соглашение о том, как код SQL должен быть отформатирован?

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

Конвенция, конечно, есть много. Это зависит от того, пытаетесь ли вы максимизировать изменчивость или минимизировать пространство. Я написал средства форматирования SQL для обоих случаев.

Я просто использовал определенные комбинации символов, чтобы сказать мне, где можно нарушить оператор SQL.

Вот один пример из средства форматирования SQL Java DB2, которое я написал. Другая программа 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: Нет. Я написал это только для того, чтобы доказать, что я могу написать приложение Java, которое пишет классы Java, а также строить SQL из столбцов базы данных и таблиц индекса (SYSIBM). К сожалению, никто, с кем я работаю, не нашел это полезным. Я полагаю, я мог бы поместить код где-нибудь, если хотите.
Гилберт Ле Блан,
Я был бы признателен, я просто хочу увидеть часть форматирования.
Джуллинз
@jullins: Я сейчас на работе, поэтому я не могу получить доступ к публичным репозиториям. Я выложу код где-нибудь в эти выходные и дам вам знать, как получить к нему доступ.
Гилберт Ле Блан,
как насчет кода? Вы можете поместить это где-нибудь?
Джуллинз
2

Немного поздно, только наткнулся на это, извините.

T-SQL Formatter для бедного человека - это средство форматирования T-SQL с открытым исходным кодом (библиотека, плагин ssms, средство форматирования файлов командной строки и т. Д.) - реализация является достаточно модульной, и в ней не должно быть сложностей в реализации токенайзера и средства форматирования MySQL. чтобы соответствовать T-SQL (я не сделал этого прежде всего потому, что у меня нет опыта или использования MySQL сейчас, так что это не очень хорошее использование моего времени).

Библиотека реализована в C # (2.0) с лицензией AGPL - это означает, что вы не можете распространять ее на коммерческой основе или предоставлять в качестве общедоступной службы без публикации каких-либо изменений, но для внутреннего пользователя это не должно представлять проблем, независимо от того, настроена она или не.

Как уже ответил @Gilbert Le Blank, стандартного форматирования SQL определенно не существует - даже коммерческие форматеры, которые предоставляют разные опции, не сходятся при одинаковых значениях по умолчанию и даже не обязательно поддерживают одинаковые выходные форматы.

Что касается написания собственного инструмента с нуля, я бы советовал против него, если вам нужно обрабатывать различные случаи: по крайней мере, для T-SQL, обработки пакетов SQL с несколькими операторами с помощью предложений CTE WITH, операторов MERGE, подзапросов и производные таблицы и т. д. оказывается довольно сложным :)

В случае, если это поможет: http://www.architectshack.com/PoorMansTSqlFormatter.ashx

Tao
источник