Копирование данных/перенос строк в отдельную базу данных на X++
Перенос данных или копирование строк из одной базы данных в другую при помощи X++ не является тривиальной задачей, но рано или поздно такая необходимость может возникнуть. Да, это можно сделать и на SQL сервере, но для этого там потребуется установить SQL linked server и настроить его. Без прав администратора сделать этого не получиться. А у нас стоит задача сделать эту операцию в Axapta.
Этот способ копирования работает очень быстро, если БД находится на одном сервере с AOS, то 800.000 строк копируются за секунды, а если на разных, то 500.000 строк за минуту.
Для работы скрипта надо убедиться, что в АОТе есть ссылка на System.Data
public void exportRecords(
System.Data.SqlClient.SqlConnection _sourceConnection,
System.Data.SqlClient.SqlConnection _destinationConnection
)
{
System.Data.SqlClient.SqlCommand cmd;
System.Data.SqlClient.SqlDataReader reader;
System.Data.SqlClient.SqlBulkCopy bulkCopy;
str sqlTxt;
str listField;
#define.tableName("TableName")
;
listField = 'FIELD_1, FIELD_2, MODIFIEDDATETIME, MODIFIEDBY, CREATEDDATETIME, CREATEDBY, DATAAREAID, RECVERSION, RECID'; // Можно просто проставить "*", чтобы не перечислять все поля
sqlTxt = strFmt('select %1 from %2 with (nolock);', listField, #tableName);
try
{
new InteropPermission(InteropKind::ClrInterop).assert();
cmd = _sourceConnection.CreateCommand();
cmd.set_CommandText(sqlTxt);
reader = cmd.ExecuteReader();
//BP Deviation documented
bulkCopy = new System.Data.SqlClient.SqlBulkCopy(_destinationConnection);
bulkCopy.set_DestinationTableName(#tableName);
// Write from the source to the destination.
bulkCopy.WriteToServer(reader);
CodeAccessPermission::revertAssert();
}
catch
{
//BP Deviation documented
error(CLRInterop::getLastException().ToString());
CodeAccessPermission::revertAssert();
throw error(strFmt("Ошибка выгрузки таблицы %1 во внешнюю базу.", #tableName));
}
}
Автор кода — Рудой Константин Петрович, разработчик АХ
Наиболее обсуждаемые: