У нас есть набор таблиц, которые мы можем быстро получить из Oracle, разбив Clob на 4 куска.Я подозреваю, что пользовательский iDataReader выглядит примерно так:
SqlBulkCopy ColumnMapping несколько столбцов
необходимо.Я изо всех сил пытаюсь, как взять части clob из хранилища данных и соединить их вместе в локальное поле varchar (max), в то же время обрабатывая другие столбцы в обычном режиме.У меня есть путь ветвления, потому что не во всех таблицах есть такое поле, и он может быть быстро обработан другим путем.
Мы испробовали множество способов, в том числе пытаясь вытянуть его непосредственно, присоединяясь к стороне оракула после измельчения.и т. д. это, кажется, БЫСТРЫЙ способ получения данных.
(по крайней мере, на порядок или величину)
try
{
int hasCLOB = (int)Dts.Variables["User::HasCLOB"].Value;
if (hasCLOB == 0)
{
using (OleDbConnection connection = new OleDbConnection(Dts.Connections["GoldenGate"].ConnectionString))
{
using (OleDbCommand cmd = new OleDbCommand(Dts.Variables["User::BaseSelectSQL"].Value.ToString(), connection))
{
connection.Open();
using (OleDbDataReader odr = cmd.ExecuteReader())
{
using (SqlConnection SQLconn = new SqlConnection(Dts.Connections["ADO_PSImport"].ConnectionString))
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(SQLconn, SqlBulkCopyOptions.TableLock, null))
{
SQLconn.Open();
bulkCopy.DestinationTableName = "dbo." + Dts.Variables["User::TableName"].Value.ToString();
bulkCopy.EnableStreaming = true;
bulkCopy.BatchSize = 5000;
//bulkCopy.BulkCopyTimeout = 0;
// Write rows from the source to the destination.
bulkCopy.WriteToServer(odr);
}
}
}
}
}
} else
{
// there is a clob field and table needs processed somewhat differently, .
}
}
столбцы столбца:
NVL(CAST(substr(DESCRLONG, 1, 4000) as VARCHAR2(4000)), ' ') AS CLOBPART1,
NVL(CAST(substr(DESCRLONG, 4001, 4000) as VARCHAR2(4000)), ' ') AS CLOBPART2,
NVL(CAST(substr(DESCRLONG, 8001, 4000) as VARCHAR2(4000)), ' ') AS CLOBPART3,
NVL(CAST(substr(DESCRLONG, 12001, 4000) as VARCHAR2(4000)), ' ') AS CLOBPART4,
NVL(CAST(substr(DESCRLONG, 16001, 4000) as VARCHAR2(4000)), ' ') AS CLOBPART5,
NVL(CAST(substr(DESCRLONG, 20001, 4000) as VARCHAR2(4000)), ' ') AS CLOBPART6,
NVL(CAST(substr(DESCRLONG, 24001, 4000) as VARCHAR2(4000)), ' ') AS CLOBPART7,
NVL(CAST(substr(DESCRLONG, 28001, 4000) as VARCHAR2(4000)), ' ') AS CLOBPART8
Локальное поле в этом случае - DESCRLONG, но может отличаться, но CLOBPARTS распространены и передаются varchar (max).Показанный путь не-CLOB, кажется, хорошо работает в зависимости от порядкового положения.Очевидно, что это не совсем сработает со многими к одному.