annotate Source/Data/Sql/SqlProvider/MsSql2012SqlProvider.cs @ 0:f990fcb411a9

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