diff --git a/Src/Asp.NetCore2/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerFastBuilder.cs b/Src/Asp.NetCore2/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerFastBuilder.cs index 4edf24c7c..b4df70353 100644 --- a/Src/Asp.NetCore2/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerFastBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerFastBuilder.cs @@ -66,6 +66,28 @@ namespace SqlSugar copy.BulkCopyTimeout = this.Context.Ado.CommandTimeOut; return copy; } + public override Task Merge(DataTable dt, EntityInfo entityInfo, string[] whereColumns, string[] updateColumns) + { + var sqlBuilder = this.Context.Queryable().SqlBuilder; + var insertColumns = entityInfo.Columns + .Where(it => it.IsIgnore == false) + .Where(it => it.IsIdentity == false) + .Where(it => it.OracleSequenceName == null) + .Where(it => it.IsOnlyIgnoreInsert == false); + var whereSql = string.Join(" , ", whereColumns.Select(it => $"tgt.{sqlBuilder.GetTranslationColumnName(it)}=src.{sqlBuilder.GetTranslationColumnName(it)}")); + var updateColumnsSql = string.Join(" , ", updateColumns.Select(it => $"tgt.{sqlBuilder.GetTranslationColumnName(it)}=src.{sqlBuilder.GetTranslationColumnName(it)}")); + var insertColumnsSqlTgt = string.Join(" , ", insertColumns.Select(it => sqlBuilder.GetTranslationColumnName(it.DbColumnName))); + var insertColumnsSqlsrc = string.Join(" , ", insertColumns.Select(it => "src." + sqlBuilder.GetTranslationColumnName(it.DbColumnName))); + var sql = $@"MERGE INTO {sqlBuilder.GetTranslationColumnName(entityInfo.DbTableName)} tgt +USING {sqlBuilder.GetTranslationColumnName(dt.TableName)} src +ON ({whereSql}) +WHEN MATCHED THEN + UPDATE SET {updateColumnsSql} +WHEN NOT MATCHED THEN + INSERT ({insertColumnsSqlTgt}) + VALUES ({insertColumnsSqlsrc});"; + return this.Context.Ado.ExecuteCommandAsync(sql); + } } }