Лучший способ вставить несколько строк вставки в SQL Server, используя PHP - PullRequest
2 голосов
/ 17 октября 2019

Я работаю над задачей синхронизации, чтобы выгрузить / загрузить данные из одного SQLServer2014 базы данных клиентского компьютера в другой SQLServer2014 на центральном онлайн-сервере, чтобы каждый раз вставлять около 36–50 тыс. Строк для обновления / вставки / удаления данных.

Процесс инициализируется пользователем в настольном приложении и при отправке в веб-приложение функция создает файл JSON, содержащий все имена таблиц базы данных с соответствующими столбцами и значениями. Обратите внимание, что столбцы и значения записываются в файл JSON только в том случае, если они не пусты или не равны нулю. Например:

{"SCHOOL":[],"PERSON":[{"PERSON_ID":1,"NAME":"PAUL","FUNCTION_ID":1},{"PERSON_ID":2,"NAME":"JOHN","AGE":20, "FUNCTION_ID":3}], "FUNCTION":["FUNCTION_ID":1,"NAME":"TEACHER"}

Процесс кода

Класс PHP читает файл JSON, получая все имена таблиц с содержимым для импорта, и преобразует его в массив, нормализующий его по именам сущностей, которые отображаются в веб-приложении PHP. Классы учения корреспондентов. (Я делаю этот процесс, чтобы увидеть, отображается ли таблица в доктрине (веб-приложении) и проверять каждый тип в базе данных, например: тип базы данных int должен быть преобразован в целое число в PHP, varchar должен быть преобразован в строки ...)

например:

SCHOOL => School, PERSON => Person, FUNCTION => Function

Для каждого имени таблицы из настольного приложения, найденного в отображенном информационном классе Doctrine в веб-приложении, создается объект PHP (универсальный класс, содержащий зависимости, поля и типы и т. Д.)и хранится в массиве.

например:

[Person] => \Entity\Sinc Object
        (
            [fields] => Array
                (
                    [PERSON_ID] => int
                    [NAME] => varchar(max)                    
                )

            [dependencies] => Array
                ......

После преобразования каждой таблицы и полей из данных JSON в имена сущностей и типы доктрин я генерирую все вставки во временную таблицу для каждого JSONdata.

например,

"PERSON":[{"PERSON_ID":1,"NAME":"PAUL","FUNCTION_ID":1} turns into 
CREATE TABLE tempdb..#tmpPerson(PERSON_ID int NULL, NAME varchar(max) NULL, AGE int NULL, FUNCTION_ID int NULL)

INSERT INTO tempdb..#tmpPerson(PERSON_ID, NAME, FUNCTION_ID) VALUES (1,"PAUL", 1);
INSERT INTO tempdb..#tmpPerson(PERSON_ID, NAME, AGE, FUNCTION_ID) VALUES (2,"JOHN", 20, 3);

Использование tempDb для выполнения каждой операции, выбирающей нужные элементы перед миграцией данных

Примечание: Если столбецпуст в файле JSON, он не будет отображаться в команде вставки.

Я сохраняю каждую вставку в массив и запускаю foreach для ее выполнения

//$entityManager from Doctrine... sqlInsertsArray contains every insert generated delimiteds with ;
function runInserts($entityManager, $sqlInsertsArray){
    $errors = array();
    foreach($sqlInsertsArray as $key => $sql){                        
            try{                
                $stmt = $entityManager->getConnection()->prepare($sql);                
                $stmt->execute();
                $stmt->closeCursor();
            }catch(Exception $e){                
                $errors[$key] = $e;
            }
    }

    $entityManager->flush();
    $entityManager->clear();
    return $errors;
}

Вопросы:

  • Каков наилучший способ запустить / вставить эти данные в базу данных?

  • Выполнение каждой строки SQL, например, очень медленное и слишком продолжительное
    много раз в зависимости от размера данных.

  • Должен ли я архивировать каждуюSQL в файл SQL. Попробуйте по-другому?

  • Есть ли способ выполнить пакетную вставку с разными столбцами?

    Приветствуются все дополнительные советы. Основными целями являются производительность и низкая стоимость, или одна из них.

В настоящее время у меня нет возможности изменить настольное приложение клиента, но я могу предложить изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...