我需要一个工具(用于内部使用)来格式化SQL代码( Server/MySQL)。
有各种各样的第三方工具和在线网站来做它,但没有确切的方式,我需要它。
因此,我想写我自己的工具,以满足我的需要。
第一个问题是,对于如何格式化SQL代码,是否有任何标准或约定?(我尝试的工具对其进行了不同的格式化)
第二个问题,我应该如何处理这个任务?首先,是否应该将sql查询转换为某种数据结构(如树)?
发布于 2011-10-14 13:17:58
...is有什么标准或约定来说明如何格式化这些代码?
标准,不。对于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
发布于 2012-02-16 09:42:49
有点晚了,只是偶然发现了这个,对不起。
可怜人的MySQL格式化程序是一个开放源码的MySQL格式化程序(库、ssms插件、命令行文件格式化程序等)--实现是相当模块化的,实现MySQL令牌器和格式化程序与MySQL标记器相匹配应该不难(我之所以没有这么做,主要是因为我现在没有MySQL的经验或使用,所以这不是我的时间的一个很好的利用)。
这个库是在C# (2.0)中使用AGPL许可证实现的--这意味着你不能在没有发布任何修改的情况下重新发布它或者公开它作为公共服务,但是对于内部用户来说,不管它是定制的还是非定制的,它都不应该出现任何问题。
正如@Gilbert已经回答的那样,SQL格式显然没有标准--即使是商业格式化程序,由于提供了不同的选项,也不会在相同的默认情况下收敛,甚至不一定支持相同的输出格式。
关于从头编写您自己的工具,如果您需要处理各种情况,我建议您不要这样做:至少对于tool,使用CTE处理带有子句、合并语句、子查询和派生表等的SQL多语句批非常困难:)
万一有什么帮助:http://www.architectshack.com/PoorMansTSqlFormatter.ashx
https://softwareengineering.stackexchange.com/questions/114346
复制相似问题