Копирование данных/перенос строк в отдельную базу данных на 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));
    }
}

 

Автор кода  — Рудой Константин Петрович, разработчик АХ

Комментариев нет


Добавить комментарий