Есть ли в SQL Server автоматический способ еженедельного добавления дельта-записей в таблицу из файла .CSV и защищенного сайта FTP? - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть таблица с записями тренировок студентов с 9-значным первичным ключом для каждого студента. Каждую неделю я получаю дельта-файл (новые курсы, который заканчивают студенты) в файле .csv, помещенном на защищенный FTP-сервер.

Существует ли автоматический способ еженедельного обновления таблицы новыми записями? Таблица в SQL Server 2014. Заранее спасибо.

SELECT 
    STUDENT_KEY, (New record might be added)
    FIRST_NAME, (New record might be added)
    LAST_NAME, (New record might be added)
    COURSE_NAME, (New record might be added)
    COURSE_NUMBER, (New record might be added)
    SCORE, (New record might be added)
    SCORE_DATE, (New record might be added)
    TRAINING_HOURS (New record might be added)
FROM   
    STUDENTS_REC

1 Ответ

0 голосов
/ 05 ноября 2019

Несмотря на отношение к здравоохранению, я использую Mirth Connect (теперь называемый NextGen Connect Integration Engine ) для такого рода вещей, независимо от отрасли. Открытый исходный код , довольно легкий и бесконечно настраиваемый, он может извлекать CSV и другие текстовые, XML и EDI-документы из различных источников, преобразовывать их, а затем отправлять на SQL Server. Использование Interface Engine, такого как Mirth Connect, обеспечивает мониторинг и инструментальную панель со встроенными журналами ошибок, архивированием и другими преимуществами.

Mirth Summary

То же самоетакже легко достигается, если вы хотите пойти в другом направлении. Например, у вас может быть запрос, который отправляет результаты обратно на SFTP-сервер.

Для описанного вами варианта использования (CSV to SQL) решение может выглядеть следующим образом:

  1. Создайте новый канал в Mirth
  2. . На вкладке «Сводка» установите для параметра «Тип данных» значение «Текст с разделителями» в исходном соединителе и XML для всех остальных соединителей. (XML является «родным» форматом Mirth - вы фактически не будете работать с XML напрямую)
  3. Во входных свойствах «Текст с разделителями» установите разделитель столбцов на «,» и установите «Имена столбцов»в "STUDENT_KEY, FIRST_NAME, LAST_NAME, COURSE_NAME, COURSE_NUMBER, SCORE, SCORE_DATE, TRAINING_HOURS" или любых других столбцах в CSV-файле.

Summary Page

На вкладке «Источник» установите тип соединителя «File Reader» и добавьте информацию о сервере FTP. Ключевыми параметрами могут быть «Метод» из «FTP» или «SFTP», в зависимости от сервера и пути, фильтра имени файла, имени пользователя и пароля. Решите, как обрабатывать «Завершенные» файлы - вы можете удалить их илипереместите их с помощью «действия после обработки». Если оставить значение «Нет», то все сообщения будут обработаны неопределенно долго. Я рекомендую включить «Проверка возраста файла», чтобы избежать чтения файлов во время их записи. 60 секунд обычно достаточно для всех, кроме самых крупных или самых медленных авторов. Установите кодировку файлов для чтения, обычно utf8 (что, я считаю, по умолчанию)

Source tab

На вкладке назначения выберите Тип коннектора «Javascript Writer» Напишите свой сценарий, вызывая SQL Server при необходимости:

Пример Javascript с E4X:

var dbConn;
var result;

try {
    dbConn = DatabaseConnectionFactory.createDatabaseConnection('net.sourceforge.jtds.jdbc.Driver','jdbc:jtds:sqlserver://127.0.0.1:1433/DBName','username','password');

    // insert header
    var params = new java.util.ArrayList();
    params.add($('originalFilename'));
    result = dbConn.executeUpdateAndGetGeneratedKeys('INSERT INTO ImportFiles ([Filename], ImportDate) VALUES (?, GETDATE());', params);
    result.next();
    var headerId = result.getInt(1);

    // save in the channel map (message data) for fun
    channelMap.put('headerId', headerId);

    // loop over rows and insert
    var msg = new XML(connectorMessage.getEncodedData());
    for each (row in msg.row) {
        if (row.Location.toString() == "Current Location") {
            // skip headers
            continue;
        }

        params = new java.util.ArrayList();
        params.add(headerId);
        params.add(row.SpillmanPatientID.toString());
        params.add(row.AdmitDate.toString());
        params.add(row.Location.toString());
        params.add(row.TransferDate.toString());
        params.add(row.LastName.toString());
        params.add(row.FirstName.toString());
        params.add(row.MiddleName.toString());
        params.add(row.SuffixName.toString());
        params.add(row.Birthdate.toString());
        params.add(row.Sex.toString());
        params.add(row.SSN.toString());
        dbConn.executeUpdate('INSERT INTO dbo.ImportData (ImportFileID, SpillmanPatientID, AdmitDate, Location, TransferDate, LastName, FirstName, MiddleName, SuffixName, Birthdate, Sex, SSN)' 
            + ' SELECT ?, ?, ?, GETDATE(), ?, ?, ?, ?, ?, ?, ?, ?, ?', params);
    }

    // call sproc
    params = new java.util.ArrayList();
    params.add(headerId);
    dbConn.executeUpdate('EXEC dbo.ProcessImportFile ?', params);
} finally {
    if (dbConn) { 
        dbConn.close();
    }
}

Обратите внимание, что элементы "строки" - это то, что вы указали для имен столбцов в настройке соединителя источника.

Нажмите «Развернуть канал» слева Проверьте работу с помощью панели мониторинга. Вы можете дважды щелкнуть канал, чтобы просмотреть отправленные сообщения (с результатами и журналами ошибок), а также щелкнуть правой кнопкой мыши и нажать «Переслать сообщение», чтобы повторить попытку (например, если вы внесете изменения в сценарий).

После того, как все настроено так, как вы хотите, я бы порекомендовал:

  1. На вкладке сводки в настройке канала
  2. Установить "Хранение сообщений"на «Производство» или «Необработанный» - вы всегда можете вернуться к разработке и повторно обработать сообщение, если у вас есть проблема
  3. Установите для параметра «Удаление метаданных» значение (например) 7 дней
  4. Установить«Пользовательские метаданные» - удалите SOURCE и TYPE, добавьте originalFilename и любые данные, которые вы добавили на карту каналов в вашем JavaScript. В приведенном выше примере я создаю «headerId», который можно использовать для корреляции между SQL и Mirth.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...