Answers:
...对于如何格式化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
有点晚了,对不起,只是偶然发现了这一点。
穷人的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