格式化SQL代码的算法


11

我需要一个用于内部使用的工具,该工具将格式化SQL代码(SQL Server / MySQL)。
有各种各样的第三方工具和在线网站可以执行此操作,但并非完全符合我的需要。

因此,我想编写适合自己需求的工具。

第一个问题是否存在有关应如何格式化SQL代码的标准或约定?(我尝试过的工具采用不同的格式)

第二个问题,我应该如何完成这项任务?首先应该将sql查询转换为某种数据结构,例如Tree吗?

Answers:


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 2011年

@jullins:不。我写它只是为了证明我可以编写一个编写Java类的Java应用程序,并可以从数据库列和索引表(SYSIBM)构建SQL。可悲的是,没有一个与我合作的人发现它有用。我想我可以根据需要将代码放在某个地方。
Gilbert Le Blanc

我将不胜感激,我只想看看格式部分。
jullins 2011年

@jullins:我现在在工作,所以我无法访问公共存储库。我将在本周末将代码放在某个地方,并让您知道如何访问它。
吉尔伯特·勒布朗克

那代码呢?你能把它放在某个地方吗?
jullins 2011年

2

有点晚了,对不起,只是偶然发现了这一点。

穷人的T-SQL格式化程序是一个开放源代码的T-SQL格式化程序(库,ssms插件,命令行文件格式化程序等)-实现是合理的模块化,并且实现MySQL标记程序和格式化程序应该不难以匹配T-SQL(我之所以没有这样做,主要是因为我现在没有使用MySQL的经验或对MySQL的使用,所以这不是我的时间的好用)。

该库使用AGPL许可证在C#(2.0)中实现-这意味着您不能在不发布任何修改的情况下将其商业发行或作为公共服务公开,但是对于内部用户而言,无论是定制的还是自定义的,它都不会出现任何问题。不。

正如@Gilbert Le Blank已经回答的那样,SQL格式化绝对没有标准-即便是商业格式化程序,它们提供了不同的选项,也不会收敛于相同的默认值,甚至不一定支持相同的输出格式。

关于从头开始编写自己的工具,如果需要处理各种情况,我建议不要这样做:至少对于T-SQL,使用CTE WITH子句,MERGE语句,子查询和派生表,等等,真是很难:)

如果有帮助,请访问:http : //www.architectshack.com/PoorMansTSqlFormatter.ashx

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.