数据表批量复制到SQL Server合并行ID

时间:2019-11-16 17:58:07

标签: c# sql-server

我正在使用下面的代码将数据表中的数据插入SQL Server。我的问题是是否有任何合并行的方法。如果id不存在,请插入,否则更新。

using (SqlTransaction transaction = connection.BeginTransaction())
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
{
    try
    {
        bulkCopy.DestinationTableName = TableName;
        bulkCopy.WriteToServer(dt);
        transaction.Commit();
    }
    catch
    {
        transaction.Rollback();
        return false;
    }
}

2 个答案:

答案 0 :(得分:0)

我强烈建议您将EFC用于此类操作,因为它很容易处理伪对象的批量操作。您可以在这里阅读有关实体框架核心批量操作的信息:https://dotnetdetail.net/entity-framework-core-3-0-bulk-insert-update-and-delete/

答案 1 :(得分:0)

带有您的DataTable值的表值参数可以在MERGE语句的条件INSERTUPDATE中使用。创建与您的DataTable模式匹配的表类型,例如:

CREATE TYPE TvpType AS TABLE(
      ID int NOT NULL PRIMARY KEY
    , DataValue int
);

然后将DataTable作为类型SqlDbType.Structured的参数传递给MERGE语句:

string mergeStatement = @"
MERGE dbo.YourTable AS target
USING @TVP AS source ON source.ID = target.ID
WHEN MATCHED THEN UPDATE SET DataValue = source.DataValue
WHEN NOT MATCHED BY TARGET THEN INSERT (ID, DataValue) VALUES(source.ID, source.DataValue);";

try
{
    using (SqlCommand mergeCommand = new SqlCommand(mergeStatement, connection))
    {
        mergeCommand.Parameters.Add("@TVP", SqlDbType.Structured).Value = dt;
        mergeCommand.ExecuteNonQuery();
    }
}
catch
{
    return false;
}