Я не знаю, выполнимо ли это для вашей проблемы, но если бы вы могли, я действительно попытался бы развить это в коде.
В прошлом у меня был похожий вопрос для большого проекта:необходимо было импортировать производственные данные за 15 лет в новую схему (в SQL Server 2005.) System.Data.SqlClient.SqlBulkCopy был безусловно самым быстрым вариантом.
Если вы все же пойдете этим путем, я предлагаю сделатьвставляет по 1 ГБ за раз, затем вручную вызывает .NET GC, чтобы освободить таблицу в памяти.Я был вынужден сделать обе эти вещи, чтобы не столкнуться с ошибками памяти (32-битная система, хотя.)
Edit - псевдокод для моего решенияg был что-то вроде:
Table dataToInsert = new Table();
var sqlCommand = new SqlCommand("select * from old database");
DataReader dataFromOldSystem = sqlCommand.ExecuteReader();
foreach (DataRow oldRow in dataFromOldSystem.Tables[0])
{
// I had to modify/transpose the row from the old table in some way
DataRow newRow = new DataRow(oldRow.GetInt(0), oldRow.GetDateTime(1), oldRow.GetInt(2));
dataToInsert.AddRow(newRow);
newRow = new DataRow(oldRow.GetInt(0), oldRow.GetDateTime(1), oldRow.GetInt(3));
dataToInsert.AddRow(newRow);
newRow = new DataRow(oldRow.GetInt(0), oldRow.GetDateTime(1), oldRow.GetInt(4));
dataToInsert.AddRow(newRow);
// check if the number of rows is over some magic number that is below the memory limit
// you can check the private bytes in use by your app to help guess this number
if (dataToInsert.Rows.Count > 1000000)
{
SqlBulkCopy bulkCopier = new BulkCopy(blah);
bulkCopier.Execute();
dataToInsert = null;
GC.Finalize();
GC.Free;
dataToInsert = new Table();
}
}