SqlServerInsertBuilder.cs 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace SqlSugar
  7. {
  8. public class SqlServerInsertBuilder:InsertBuilder
  9. {
  10. public override Func<string, string, string> ConvertInsertReturnIdFunc { get; set; } = (name, sql) =>
  11. {
  12. return sql.Replace("select SCOPE_IDENTITY();", "").Replace(")\r\n SELECT", $")\r\n OUTPUT INSERTED.{name} as {name} \r\nSELECT");
  13. };
  14. public override bool IsNoPage { get; set; } = true;
  15. public override string ToSqlString()
  16. {
  17. if (IsNoInsertNull)
  18. {
  19. DbColumnInfoList = DbColumnInfoList.Where(it => it.Value != null).ToList();
  20. }
  21. var groupList = DbColumnInfoList.GroupBy(it => it.TableId).ToList();
  22. var isSingle = groupList.Count() == 1;
  23. string columnsString = string.Join(",", groupList.First().Select(it => Builder.GetTranslationColumnName(it.DbColumnName)));
  24. var result = "";
  25. if (isSingle)
  26. {
  27. string columnParametersString = string.Join(",", this.DbColumnInfoList.Select(it =>base.GetDbColumn(it,Builder.SqlParameterKeyWord + it.DbColumnName)));
  28. result= string.Format(SqlTemplate, GetTableNameString, columnsString, columnParametersString);
  29. }
  30. else
  31. {
  32. StringBuilder batchInsetrSql = new StringBuilder();
  33. int pageSize = 200;
  34. if (this.EntityInfo.Columns.Count > 30)
  35. {
  36. pageSize = 50;
  37. }
  38. else if (this.EntityInfo.Columns.Count > 20)
  39. {
  40. pageSize = 100;
  41. }
  42. if (IsNoPage && IsReturnPkList)
  43. {
  44. pageSize = groupList.Count;
  45. }
  46. int pageIndex = 1;
  47. int totalRecord = groupList.Count;
  48. int pageCount = (totalRecord + pageSize - 1) / pageSize;
  49. while (pageCount >= pageIndex)
  50. {
  51. batchInsetrSql.AppendFormat(SqlTemplateBatch, GetTableNameString, columnsString);
  52. int i = 0;
  53. foreach (var columns in groupList.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList())
  54. {
  55. var isFirst = i == 0;
  56. if (!isFirst)
  57. {
  58. batchInsetrSql.Append(SqlTemplateBatchUnion);
  59. }
  60. batchInsetrSql.Append("\r\n SELECT " + string.Join(",", columns.Select(it => string.Format(SqlTemplateBatchSelect,base.GetDbColumn(it, FormatValue(it.Value)), Builder.GetTranslationColumnName(it.DbColumnName)))));
  61. ++i;
  62. }
  63. pageIndex++;
  64. batchInsetrSql.Append("\r\n;\r\n");
  65. }
  66. result = batchInsetrSql.ToString();
  67. if (this.Context.CurrentConnectionConfig.DbType == DbType.SqlServer)
  68. {
  69. result += "select SCOPE_IDENTITY();";
  70. }
  71. }
  72. if (this.IsOffIdentity)
  73. {
  74. var tableName = this.GetTableNameString;
  75. result= $"SET IDENTITY_INSERT {tableName} ON;" + result.TrimEnd(';') + $";SET IDENTITY_INSERT {tableName} OFF"; ;
  76. }
  77. return result;
  78. }
  79. public override string FormatDateTimeOffset(object value)
  80. {
  81. return "'" + ((DateTimeOffset)value).ToString("o") + "'";
  82. }
  83. }
  84. }