SqlServer Merge

This commit is contained in:
sunkaixuan
2023-10-04 19:26:29 +08:00
parent 4b37b51e73
commit 31aae95883

View File

@@ -66,6 +66,28 @@ namespace SqlSugar
copy.BulkCopyTimeout = this.Context.Ado.CommandTimeOut;
return copy;
}
public override Task<int> Merge(DataTable dt, EntityInfo entityInfo, string[] whereColumns, string[] updateColumns)
{
var sqlBuilder = this.Context.Queryable<object>().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);
}
}
}