对数据量大但更改集小的表进行批量更新/合并的最佳方法

本文关键字:更新 合并 方法 最佳 数据 | 更新日期: 2023-09-27 18:19:00

我有一个表,有200K+行,我需要每天更新。我的控制台应用程序在每天运行时生成所有这些数据,并需要使用结果更新表。

的情况是,我在一个缓慢的网络上操作,在每次运行时,有不到0.1%的行更新/插入/删除,所以显然有空间来优化。表是简单的- key列,加上2个nvarchar列。

所以我的问题是——在这种特殊情况下最好的方法是什么?我总是可以处理它并执行SQLBulkCopy,但是SqlDataAdapter会更有效吗?

Thx,

迈克

对数据量大但更改集小的表进行批量更新/合并的最佳方法

随对存储过程的所有更改一起发布XML

访问数据库。

这里有一个老的例子:

http://granadacoder.wordpress.com/2009/01/27/bulk-insert-example-using-an-idatareader-to-strong-dataset-to-sql-server-xml/

下面是一个较小的示例,但显示了基本内容。

http://www.mindfiresolutions.com/sending -多个记录——- xml - sql - server -存储-过程- 1861. php

发送xml到存储过程。将xml分解为一个@variable或#temp表。使用@variable或#temp表执行update/insert(或MERGE/UPSERT)。

编辑:

http://weblogs.asp.net/dwahlin/archive/2009/09/30/passing-multiple-records-to-a-stored-procedure-in-sql-server.aspx

另一个例子。

我喜欢做的是创建一个强数据集。将您的数据放入强数据集。然后将ds.GetXml()发送到存储过程。

这样,您就获得了强类型(使用强数据集),并且您不必编写自己的xml生成器,您可以依靠. getxml()。提示:创建强数据集后,删除名称空间(tempuri或类似的东西)

APPEND (Spring, 2019)

由于xml"膨胀",我不再将项放入强数据集(或任何数据集)。

我编写了一个自定义pocooobject - to - xml转换器(基于xml属性),并将其传递给存储过程。

下面是基于元素的…并显示了xml膨胀

<Employees>
  <Employee>
      <EmployeeKey>123</EmployeeKey>
      <LastName>Smith</LastName>
      <FirstName>John</FirstName>
  </Employee>
  <Employee>
      <EmployeeKey>234</EmployeeKey>
      <LastName>Jones</LastName>
      <FirstName>Mary</FirstName>
  </Employee>
</Employees>

vs (more trim down)

<Employees>
  <Employee EmployeeKey="123" LastName="Smith" FirstName="John" />
  <Employee EmployeeKey="234" LastName="Jones" FirstName="Mary" />
</Employees>

和下面的自定义转换器代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
namespace MyNamespace
{
    public class EmployeesToXmlConverter
    {
        public string ConvertToXmlString(ICollection<EmployeePoco> emps)
        {
            StringBuilder sb = new StringBuilder();
            XmlWriter writer = XmlWriter.Create(sb);
            writer.WriteStartElement("root");
            if (null != emps && emps.Any())
            {
                writer.WriteStartElement("Employees");
                foreach (EmployeePoco emp in emps)
                {
                    writer.WriteStartElement("Employee");
                    writer.WriteAttributeString("EmployeeKey", Convert.ToString(emp.EmployeeKey));
                    writer.WriteAttributeString("LastName", emp.LastName);
                    writer.WriteAttributeString("FirstName", emp.FirstName);
                    writer.WriteEndElement(); ////closing patient tag
                }
                writer.WriteEndElement(); ////closing emps tag
            }
            writer.WriteEndElement(); ////closing root tag
            writer.Close();
            string returnValue = sb.ToString();
            return returnValue;
        }
    }
}