#php #sql #sql-server #insert #odbc
#php #sql #sql-сервер #вставить #odbc
Вопрос:
Я использую PHP с подключением odbc к базе данных MSSQL.
В настоящее время у меня около 1900 инструкций insert в одной строке, разделенных точкой с запятой, и я выполняю это в 1 инструкции odbc_execute.
Во-первых, плохой ли это метод? Должен ли я обрабатывать каждый оператор insert отдельно в цикле for?
Кроме того, то, как я сейчас это делаю, с помощью 1 большого оператора, по какой-то причине без ошибок вставляется максимум 483 строки. Если я скопирую инструкцию, которая выполняется, и выполняю это через SQL studio, вставляются все строки, но каждый раз вставляется максимум 483 строки. Есть идеи, почему это может быть?
Ответ №1:
Один сетевой переход туда и обратно на вставку будет означать большую задержку. Это будет очень медленно.
Вероятно, существует ограничение на размер буфера всех этих объединенных операторов SQL.
Я думаю, вы хотите использовать подготовленный оператор и связанные переменные:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms712553 (v = против 85).aspx
Вы все еще можете обработать это в цикле — два, на самом деле. Вам понадобится внутренний цикл для добавления вставок в пакет, который выполняется как отдельная транзакция, и внешний цикл для обработки всех необходимых пакетов.
Комментарии:
1. Так это то же самое, что в принципе сказать поместить каждые 100 строк в массив, затем выполнить цикл по этому массиву, выполняя ту же инструкцию odbc_execute?
Ответ №2:
Пока вы не запускаете отдельную транзакцию для каждой вставки, нет ничего плохого в том, чтобы вставлять по одному за раз.
Для такого рода «пакетной вставки» я обычно запускаю транзакцию для каждых 100 строк или около того.
Я бы не пытался втиснуть их все сразу. на самом деле это ничего не даст.
Ответ №3:
Вы можете поместить данные в файл (xml?) на sql-сервере и запросить хранимую процедуру из php, которая их обработает.
с уважением, /t