package jef.database.dialect; import jef.database.dialect.handler.DerbyLimitHandler; import jef.database.dialect.handler.LimitHandler; import jef.database.meta.Feature; import jef.database.query.Func; import jef.database.query.function.StandardSQLFunction; /** * SQL Server 2012 * @author jiyi * */ public class SQLServer2012Dialect extends SQLServer2008Dialect{ public SQLServer2012Dialect(){ super(); //2012开始支持SEQUENCE features.add(Feature.SUPPORT_SEQUENCE); addFunctions(); } /* * 2012新增的14个函数 * Reference * http://msdn.microsoft.com/en-us/library/09f0096e-ab95-4be0-8c01-f98753255747(v=sql.110) */ private void addFunctions() { registerNative(new StandardSQLFunction("parse")); registerNative(new StandardSQLFunction("try_convert")); registerNative(new StandardSQLFunction("try_parse")); registerNative(new StandardSQLFunction("datefromparts")); registerNative(new StandardSQLFunction("datetime2fromparts")); registerNative(new StandardSQLFunction("datetimefromparts")); registerNative(new StandardSQLFunction("datetimeoffsetfromparts")); registerNative(new StandardSQLFunction("eomonth")); registerNative(new StandardSQLFunction("smalldatetimefromparts")); registerNative(new StandardSQLFunction("timefromparts")); registerNative(new StandardSQLFunction("choose")); registerNative(new StandardSQLFunction("iif")); registerNative(new StandardSQLFunction("format")); super.features.remove(Feature.CONCAT_IS_ADD); registerNative(Func.concat);//2012开始支持原生的concat函数。 // 2012新增的分析函数 // CUME_DIST (Transact-SQL) // LAST_VALUE (Transact-SQL) // PERCENTILE_DISC (Transact-SQL) // // FIRST_VALUE (Transact-SQL) // LEAD (Transact-SQL) // PERCENT_RANK (Transact-SQL) // // LAG (Transact-SQL) // PERCENTILE_CONT (Transact-SQL) // } @Override protected LimitHandler generateLimitHander() { return new DerbyLimitHandler(); } // private final static String PAGE_SQL_2012 = " offset %start% row fetch next %next% rows only"; // // // @Override // public String toPageSQL(String sql, IntRange range) { // String start = String.valueOf(range.getLeastValue() - 1); // String next = String.valueOf(range.getGreatestValue() - range.getLeastValue() + 1); // String limit = StringUtils.replaceEach(PAGE_SQL_2012, new String[] { "%start%", "%next%" }, new String[] { start, next }); // return sql.concat(limit); // } }