Mercurial > pub > bltoolkit
comparison Source/Data/Sql/SqlProvider/MsSql2012SqlProvider.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:f990fcb411a9 |
---|---|
1 using System; | |
2 using System.Text; | |
3 | |
4 namespace BLToolkit.Data.Sql.SqlProvider | |
5 { | |
6 public class MsSql2012SqlProvider : MsSqlSqlProvider | |
7 { | |
8 protected override string LimitFormat { get { return SqlQuery.Select.SkipValue != null ? "FETCH NEXT {0} ROWS ONLY" : null; } } | |
9 protected override string OffsetFormat { get { return "OFFSET {0} ROWS"; } } | |
10 protected override bool OffsetFirst { get { return true; } } | |
11 protected override bool BuildAlternativeSql { get { return false; } } | |
12 | |
13 protected override ISqlProvider CreateSqlProvider() | |
14 { | |
15 return new MsSql2012SqlProvider(); | |
16 } | |
17 | |
18 protected override void BuildInsertOrUpdateQuery(StringBuilder sb) | |
19 { | |
20 BuildInsertOrUpdateQueryAsMerge(sb, null); | |
21 sb.AppendLine(";"); | |
22 } | |
23 | |
24 protected override void BuildSql(StringBuilder sb) | |
25 { | |
26 if (NeedSkip && SqlQuery.OrderBy.IsEmpty) | |
27 { | |
28 for (var i = 0; i < SqlQuery.Select.Columns.Count; i++) | |
29 SqlQuery.OrderBy.ExprAsc(new SqlValue(i + 1)); | |
30 } | |
31 | |
32 base.BuildSql(sb); | |
33 } | |
34 | |
35 protected override void BuildFunction(StringBuilder sb, SqlFunction func) | |
36 { | |
37 func = ConvertFunctionParameters(func); | |
38 | |
39 switch (func.Name) | |
40 { | |
41 case "CASE" : func = ConvertCase(func.SystemType, func.Parameters, 0); break; | |
42 case "Coalesce" : | |
43 | |
44 if (func.Parameters.Length > 2) | |
45 { | |
46 var parms = new ISqlExpression[func.Parameters.Length - 1]; | |
47 | |
48 Array.Copy(func.Parameters, 1, parms, 0, parms.Length); | |
49 BuildFunction(sb, new SqlFunction(func.SystemType, func.Name, func.Parameters[0], | |
50 new SqlFunction(func.SystemType, func.Name, parms))); | |
51 return; | |
52 } | |
53 | |
54 var sc = new SqlQuery.SearchCondition(); | |
55 | |
56 sc.Conditions.Add(new SqlQuery.Condition(false, new SqlQuery.Predicate.IsNull(func.Parameters[0], false))); | |
57 | |
58 func = new SqlFunction(func.SystemType, "IIF", sc, func.Parameters[1], func.Parameters[0]); | |
59 | |
60 break; | |
61 } | |
62 | |
63 base.BuildFunction(sb, func); | |
64 } | |
65 | |
66 static SqlFunction ConvertCase(Type systemType, ISqlExpression[] parameters, int start) | |
67 { | |
68 var len = parameters.Length - start; | |
69 var name = start == 0 ? "IIF" : "CASE"; | |
70 var cond = parameters[start]; | |
71 | |
72 if (start == 0 && SqlExpression.NeedsEqual(cond)) | |
73 { | |
74 cond = new SqlQuery.SearchCondition( | |
75 new SqlQuery.Condition( | |
76 false, | |
77 new SqlQuery.Predicate.ExprExpr(cond, SqlQuery.Predicate.Operator.Equal, new SqlValue(1)))); | |
78 } | |
79 | |
80 if (len == 3) | |
81 return new SqlFunction(systemType, name, cond, parameters[start + 1], parameters[start + 2]); | |
82 | |
83 return new SqlFunction(systemType, name, | |
84 cond, | |
85 parameters[start + 1], | |
86 ConvertCase(systemType, parameters, start + 2)); | |
87 } | |
88 } | |
89 } |