Mercurial > pub > bltoolkit
diff Source/Data/Sql/SqlProvider/MsSql2012SqlProvider.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Source/Data/Sql/SqlProvider/MsSql2012SqlProvider.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,89 @@ +using System; +using System.Text; + +namespace BLToolkit.Data.Sql.SqlProvider +{ + public class MsSql2012SqlProvider : MsSqlSqlProvider + { + protected override string LimitFormat { get { return SqlQuery.Select.SkipValue != null ? "FETCH NEXT {0} ROWS ONLY" : null; } } + protected override string OffsetFormat { get { return "OFFSET {0} ROWS"; } } + protected override bool OffsetFirst { get { return true; } } + protected override bool BuildAlternativeSql { get { return false; } } + + protected override ISqlProvider CreateSqlProvider() + { + return new MsSql2012SqlProvider(); + } + + protected override void BuildInsertOrUpdateQuery(StringBuilder sb) + { + BuildInsertOrUpdateQueryAsMerge(sb, null); + sb.AppendLine(";"); + } + + protected override void BuildSql(StringBuilder sb) + { + if (NeedSkip && SqlQuery.OrderBy.IsEmpty) + { + for (var i = 0; i < SqlQuery.Select.Columns.Count; i++) + SqlQuery.OrderBy.ExprAsc(new SqlValue(i + 1)); + } + + base.BuildSql(sb); + } + + protected override void BuildFunction(StringBuilder sb, SqlFunction func) + { + func = ConvertFunctionParameters(func); + + switch (func.Name) + { + case "CASE" : func = ConvertCase(func.SystemType, func.Parameters, 0); break; + case "Coalesce" : + + if (func.Parameters.Length > 2) + { + var parms = new ISqlExpression[func.Parameters.Length - 1]; + + Array.Copy(func.Parameters, 1, parms, 0, parms.Length); + BuildFunction(sb, new SqlFunction(func.SystemType, func.Name, func.Parameters[0], + new SqlFunction(func.SystemType, func.Name, parms))); + return; + } + + var sc = new SqlQuery.SearchCondition(); + + sc.Conditions.Add(new SqlQuery.Condition(false, new SqlQuery.Predicate.IsNull(func.Parameters[0], false))); + + func = new SqlFunction(func.SystemType, "IIF", sc, func.Parameters[1], func.Parameters[0]); + + break; + } + + base.BuildFunction(sb, func); + } + + static SqlFunction ConvertCase(Type systemType, ISqlExpression[] parameters, int start) + { + var len = parameters.Length - start; + var name = start == 0 ? "IIF" : "CASE"; + var cond = parameters[start]; + + if (start == 0 && SqlExpression.NeedsEqual(cond)) + { + cond = new SqlQuery.SearchCondition( + new SqlQuery.Condition( + false, + new SqlQuery.Predicate.ExprExpr(cond, SqlQuery.Predicate.Operator.Equal, new SqlValue(1)))); + } + + if (len == 3) + return new SqlFunction(systemType, name, cond, parameters[start + 1], parameters[start + 2]); + + return new SqlFunction(systemType, name, + cond, + parameters[start + 1], + ConvertCase(systemType, parameters, start + 2)); + } + } +}