【问题标题】:Datatable bulk copy to SQL Server merge row id数据表大容量复制到 SQL Server 合并行 ID
【发布时间】:2019-11-16 17:58:07
【问题描述】:

我正在使用下面的代码将数据表中的数据插入 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;
    }
}

【问题讨论】:

  • 批量复制到临时表,根据连接更新到临时表,插入不存在的地方,然后截断临时表。
  • 不,您不能使用BulkCopy 进行更新。您可以做的是批量复制到临时表中,然后运行存储过程并使用Merge 打乱到最终表中。
  • 考虑在您的 DataTable 值中使用表值参数,并在 MERGE 语句中使用它。
  • 谢谢丹。有没有办法在没有我的 bulkCopy 数据表的情况下创建一个新的 TempTable?不定义列名?
  • TVP 实际上是一个临时表,但它需要定义一个表类型。我会详细回答。

标签: c# sql-server


【解决方案1】:

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

【讨论】:

  • 一个帖子只是一个链接到别处不是答案 - 它是关于答案在哪里的注释。这可能是一条评论。
  • 刚开始评论,没意识到 :) 没问题,谢谢建议。
  • 我有更好的解决方案和方法来实现这一点。这将非常快,响应时间会非常非常短。
【解决方案2】:

可以在MERGE 语句中为条件INSERTUPDATE 使用带有DataTable 值的表值参数。创建与您的 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;
}

【讨论】:

    猜你喜欢
    • 2011-01-10
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2011-03-18
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多