SqlServerUpdateBuilder.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Text.RegularExpressions;
  6. using System.Threading.Tasks;
  7. namespace SqlSugar
  8. {
  9. public class SqlServerUpdateBuilder: UpdateBuilder
  10. {
  11. protected override string TomultipleSqlString(List<IGrouping<int, DbColumnInfo>> groupList)
  12. {
  13. Check.Exception(PrimaryKeys == null || PrimaryKeys.Count == 0, " Update List<T> need Primary key");
  14. int pageSize = 200;
  15. int pageIndex = 1;
  16. int totalRecord = groupList.Count;
  17. int pageCount = (totalRecord + pageSize - 1) / pageSize;
  18. StringBuilder batchUpdateSql = new StringBuilder();
  19. while (pageCount >= pageIndex)
  20. {
  21. StringBuilder updateTable = new StringBuilder();
  22. string setValues = string.Join(",", groupList.First().Where(it => it.IsPrimarykey == false && (it.IsIdentity == false || (IsOffIdentity && it.IsIdentity))).Select(it =>
  23. {
  24. if (SetValues.IsValuable())
  25. {
  26. var setValue = SetValues.Where(sv => sv.Key == Builder.GetTranslationColumnName(it.DbColumnName));
  27. if (setValue != null && setValue.Any())
  28. {
  29. return setValue.First().Value;
  30. }
  31. }
  32. var result = string.Format("S.{0}=T.{0}", Builder.GetTranslationColumnName(it.DbColumnName));
  33. return result;
  34. }));
  35. batchUpdateSql.AppendFormat(SqlTemplateBatch.ToString(), setValues, GetTableNameStringNoWith, TableWithString);
  36. int i = 0;
  37. foreach (var columns in groupList.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList())
  38. {
  39. var isFirst = i == 0;
  40. if (!isFirst)
  41. {
  42. updateTable.Append(SqlTemplateBatchUnion);
  43. }
  44. updateTable.Append("\r\n SELECT " + string.Join(",", columns.Select(it => string.Format(base.SqlTemplateBatchSelect, base.GetDbColumn(it, GetValue(it)), Builder.GetTranslationColumnName(it.DbColumnName)))));
  45. ++i;
  46. }
  47. pageIndex++;
  48. updateTable.Append("\r\n");
  49. string whereString = null;
  50. if (this.WhereValues.HasValue())
  51. {
  52. foreach (var item in WhereValues)
  53. {
  54. var isFirst = whereString == null;
  55. whereString += (isFirst ? null : " AND ");
  56. whereString += Regex.Replace(item, "\\" + this.Builder.SqlTranslationLeft, "S." + this.Builder.SqlTranslationLeft);
  57. }
  58. }
  59. if (PrimaryKeys.HasValue())
  60. {
  61. foreach (var item in PrimaryKeys)
  62. {
  63. var isFirst = whereString == null;
  64. whereString += (isFirst ? null : " AND ");
  65. whereString += string.Format("S.{0}=T.{0}", Builder.GetTranslationColumnName(item));
  66. }
  67. }
  68. batchUpdateSql.AppendFormat(SqlTemplateJoin, updateTable, whereString);
  69. }
  70. batchUpdateSql = GetBatchUpdateSql(batchUpdateSql);
  71. return batchUpdateSql.ToString();
  72. }
  73. private StringBuilder GetBatchUpdateSql(StringBuilder batchUpdateSql)
  74. {
  75. if (ReSetValueBySqlExpListType == null && ReSetValueBySqlExpList != null)
  76. {
  77. var result = batchUpdateSql.ToString();
  78. foreach (var item in ReSetValueBySqlExpList)
  79. {
  80. var dbColumnName = item.Value.DbColumnName;
  81. if (item.Value.Type==ReSetValueBySqlExpListModelType.List)
  82. {
  83. result = result.Replace($"T.{dbColumnName}", $" S.{dbColumnName}{item.Value.Sql}T.{dbColumnName}");
  84. }
  85. else
  86. {
  87. result = result.Replace($"T.{dbColumnName}", item.Value.Sql.Replace(dbColumnName, "S." + dbColumnName));
  88. }
  89. batchUpdateSql = new StringBuilder(result);
  90. }
  91. }
  92. return batchUpdateSql;
  93. }
  94. private object GetValue(DbColumnInfo it)
  95. {
  96. if (it.SqlParameterDbType!=null&&it.SqlParameterDbType.Equals(System.Data.DbType.AnsiString))
  97. {
  98. var value = FormatValue(it.Value);
  99. if (value is string&&value.ObjToString().StartsWith("N'"))
  100. {
  101. return value.ObjToString().TrimStart('N');
  102. }
  103. else
  104. {
  105. return value;
  106. }
  107. }
  108. else
  109. {
  110. return FormatValue(it.Value);
  111. }
  112. }
  113. public override string FormatDateTimeOffset(object value)
  114. {
  115. return "'"+((DateTimeOffset)value).ToString("o")+"'";
  116. }
  117. }
  118. }