Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL Server bulkcopy插入百万条记录速度较慢_C#_Sql_Sql Server 2005_Poc - Fatal编程技术网

C# SQL Server bulkcopy插入百万条记录速度较慢

C# SQL Server bulkcopy插入百万条记录速度较慢,c#,sql,sql-server-2005,poc,C#,Sql,Sql Server 2005,Poc,我有一张有一百万条记录的桌子。我需要能够将这些记录移动到另一个数据库和另一个表中 我正在使用存储过程来获取数据。它填充一个数据适配器,然后将数据bcp到新表中 我们使用的是SQLServer2005和C4。我们将使用C 4.6或5.0迁移到SQL Server 2012或2014以及Visual Studio 2015。如果有任何功能可以使其正常工作 对于10k记录,该过程不到1秒 对于500k记录,dataadapter内存不足,进程失败。 批处理100k条记录时,select语句是SQL中的

我有一张有一百万条记录的桌子。我需要能够将这些记录移动到另一个数据库和另一个表中

我正在使用存储过程来获取数据。它填充一个数据适配器,然后将数据bcp到新表中

我们使用的是SQLServer2005和C4。我们将使用C 4.6或5.0迁移到SQL Server 2012或2014以及Visual Studio 2015。如果有任何功能可以使其正常工作

对于10k记录,该过程不到1秒 对于500k记录,dataadapter内存不足,进程失败。 批处理100k条记录时,select语句是SQL中的问题,每次返回100k条记录需要每个循环2分钟。 我下面的代码有没有一种方法,或者说有什么问题,可以防止数据适配器被填充,而是映射列,让BulkCopy留在服务器端,然后像SSIS一样将记录从db推送到新表中

看起来大容量复制本身的速度非常快,但是适配器填充失败,因为它在尝试向适配器填充100万条记录时耗尽了内存。不需要一次做一行,我只想在表之间移动数据

一个表有27列,其中5列不在表2中,表2中有32列,并且两个表中的某些列的名称不相同

这是概念验证PoC

sourceConn_transDB.Open();
SqlCommand sourceCommand = new SqlCommand(queryString, sourceConn_transDB);
DataTable table = new DataTable();

sourceCommand.CommandTimeout = 600;

using (var adapter = new SqlDataAdapter(sourceCommand))
{
    WriteLineWithTime("Adapter Fill");
    adapter.Fill(table);
}

if ((table == null) || (table.Rows.Count <= 0))
   break;

using (SqlBulkCopy bulk = new SqlBulkCopy(targetConn_reportDB, SqlBulkCopyOptions.KeepIdentity, null) { DestinationTableName = "PatientEvent" })
{
    bulk.ColumnMappings.Add(new SqlBulkCopyColumnMapping("PatientID", "PatientID"));
}
如果您尝试过使用带有IDataReader的WriteToServer重载,那么您根本不需要使用DataTable

如果您尝试过使用带有IDataReader的WriteToServer重载,那么您根本不需要使用DataTable


我现在就试试。我相信这正是我要找的,但我找不到。就是这个,谢谢。仅缺少批量之前的targetConn_reportDB.Open。writetoserver…将立即尝试。我相信这正是我要找的,但我找不到。就是这个,谢谢。在bulk.writetoserver之前只缺少targetConn_reportDB.Open。。。。
sourceConn_transDB.Open();
using(SqlCommand sourceCommand = new SqlCommand(queryString, sourceConn_transDB))
{
    sourceCommand.CommandTimeout = 600;

    using (SqlDataReader reader = sourceCommand.ExecuteReader())
    using (SqlBulkCopy bulk = new SqlBulkCopy(targetConn_reportDB, SqlBulkCopyOptions.KeepIdentity, null) { DestinationTableName = "PatientEvent" })
    {
        bulk.ColumnMappings.Add(new SqlBulkCopyColumnMapping("PatientID", "PatientID"));
        bulk.WriteToServer(reader);
    }
}