#0
by MikhaDi4
Привет! Подскажите, кто знает, как сабж сделать? SQL синтаксис почти не знаю. Из 1с8 подключаюсь через ОДБЦ к базе MySQL и требуется обновлять одну из табличек этой БД. Прочитал немного по sql, мне вроде подходит оператор MERGE, но до его использования я пока не дошел. Смотрю сначала, как табличку хотябы просто заполнить. Есть оператор insert (ТекстЗапроса = "INSERT INTO `itemsinfo` (id, NAME, value) VALUES (4, ""Леопольд"", 1200)"), он работает, но это получается, что если у меня тысяча строк в 1С, то нужно последовательно тысячу раз сделать такой запрос... Понятно, что чтучки вроде передачи такого запроса : ТекстЗапроса = "INSERT INTO `parser_itemsinfo` SELECT * FROM "+ТЗ; (где ТЗ моя табличка, пусть и с такимиже названиями колонок) выдает ошибку. Вот хочу узнать, может кто знает, как записать в скуль сразу всю табличку из 1С, ну и вообще как лучше внешние sql таблицы обновлять, каким оператором и т.п.?
#2
by Kreont
я за "insert" :) Главное учти что есть ограничение на к-во текста в одном запросе, так "на глаз" то всегда делю по макс 1000 строк в один запрос вставки.
#5
by MikhaDi4
угу, я тоже подумал, что если шибко дофига строк в таблице, то это может плохо кончиться, нужно типа порциями сувать. Но хз как
#10
by MikhaDi4
ха ха, ну не, не проблема конечно )) Но, есть ограничения в правах на сервере mysql и он далеко находится (и мне кажется неочень хорошо будет здоровый файл гонять, хотя посмотрю конечно), кроме того, мы хотим уйти от обмена через файл... (сейчас 1с выплевывает файлик, который читается левой программкой и пишется в мускуль).
#12
by Живой Ископаемый
поставь мс скл на сервере 1с, чтобы утилита балкинсерт была бы тут, рядом. Файл нужно подсовывать этой утилите а не мссклю, а она уже может булкать в удаленный мсскл сервер. Ничем от адодб это отличаться не будет.
#15
by Александр_Тверь
вообще, одним запросом это делается примерно так: (10, "Он", 1300), .... (10, "Он", 1400) и т.д. обработка из умеет все что нужно делать. Пользоваться очень легко. Сама разбивает большие таблицы на порции по 1000 строк (по опыту - оптимальный размер, но параметр можно изменить). Можно просто как образец посмотреть. Обработка моя и если нет доступа на инфостарт могу прислать на e-mail.
#17
by Александр_Тверь
не факт. разрешенным может быть очень большое количество, но вот тупо зависает. я отправлял таблицу в 10 000 строк - проходило, но медленные чем 10 по 1000.
#18
by Александр_Тверь
кстати, обработка если не получилось с первого раза - делает три попытки передать текущую порцию. если все попытки провалились только тогда прекращает работу и возвращает ошибку.
#20
by MikhaDi4
ну я и имел в виду такой запрос (по ошибке про цикл написал). Доступ есть, к сожалению, только на работе к ИС. Можешь выслать на электронку (mr.samuelsonГАВГАВya.ru)?
#21
by Александр_Тверь
ты собираешь запрос вида INSERT INTO `itemsinfo` (id, NAME, value) VALUES (4, "Леопольд", 1200), (10, "Он", 1300) с нужным количеством строк - и отправляешь один раз. а не по одной строке INSERT INTO `itemsinfo` (id, NAME, value) VALUES (4, "Леопольд", 1200) сейчас вышлю.
#24
by Александр_Тверь
отправил. обработка не очень сложная, но перекрывает практически все потребности по работе с MySQL в части касающейся отправки и приема данных. У меня оно в боевом режиме каждый день используется для обмена с кассовым ПО.
#25
by MikhaDi4
дык этот один запрос (большой) и вызвал у меня сомнения. Его веть на порции делить нужно. А между порциями переданных запросов на скуль, данные в самом скуле, гипотетически, могут измениться.. Обраотку получил.
#26
by Александр_Тверь
а как ты хочешь передавать данные не перечисляя их все? А то, что их их делить надо - это факт.
#27
by MikhaDi4
я не знаю. Думал, что ну, что-то типа контейнера на скуле сделать, заполнить его. А потом таблицу залочить для изменеия кем либо кроме меня и обновить... Но, может это и баловство.
#29
by Александр_Тверь
все зависит от того какие задачи решаются. Но лично мне таким заниматься не приходилось. Ибо просто не нужно.
#30
by MikhaDi4
так у тебя ф-я ОтправитьДанныеПоПодготовленнойТаблице именно то, что в и делает так?
#31
by Александр_Тверь
да. правда еще при этом разбивает таблицу на нужное количество строк + при в случае неудачной отправки данных делает 3 попытки их отправить.
#33
by Александр_Тверь
блин... забыл версию обработки обновить на инфостарте :) у меня есть еще функция ОтправитьДанныеПоСтруктуре т.е. кидаешь структуру в которой ключ имя таблицы, а значение - таблица. и оно все само отправляет. завтра обновлю.
#35
by Александр_Тверь
+ доделал возможность игнорирования вставки дубликатов. Если отправляемая таблица содержит дубли с тем, что уже есть в таблице на MySQL.
#37
by MikhaDi4
А проверка этих дублей идет по всем полям или список таких (ключевых)полей можно задать?
#38
by ksergey
Уважаемый, подскажи, есть ли вариант "пакетного" запроса для команды UPDATE table SET field1 = ****, field2 = **** WHERE id=xxxxxxx Спасибо
#41
by ksergey
наверно типа такого - это же всё одно будет быстрей чем 1000 раз гнать пакеты по одной команде
#42
by Александр_Тверь
нет, такой возможности, на сколько мне известно -нет. Правда обработка из эмулирует пакетную работу. т.е. в нее можно передать один большой запрос разделенный точкой с запятой, а обработка сама его разобьет на отдельные запросы. Вообще не вижу проблемы, если соединение держать открытым (а не каждый раз зыкрывать), то больших проблем не будет. Так же, если нужно ну очень много данных проапдейтить, может проще их удалить (перечислить все id) и залить заново одной командой?
#43
by Александр_Тверь
т.е. первый запрос типа delete - удаляет 1000 записей, которые ты хочешь обновить второй запрос - один instrt на 1000 строк. Правда не уверен, что это будет быстрее чем 1000 раз Update сделать. надо тестить (возможно на разных данных будет разный результат).
#45
by ksergey
недавно нечто подобное делал для базы сайта на MSSQL. Подход с массой вставкой был реализован по схожей схеме: INSERT INTO dbo.Owner (field1,field2,field3) SELECT value1,value2,value3 UNION ALL SELECT value11,value12,value13 UNION ALL SELECT value21,value22,value23 ... так скорость выросла примерно в 2,5 раза по сравнению если вставлять одиночными пакетами
#46
by Александр_Тверь
думаю очень много зависит от самого характера данных. но я не решал задачу оптимизацию обновления большого массива данных, по этому опыта в данном вопросе - нет.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
- Добавить в сущест. ТЗ строку из другой ТЗ
- БУ и НУ: ну - и ну!!!
- Создание ТЗ с вложенными ТЗ на основании плоской ТЗ методом группир. по колонкам
- ТЗ.Свернуть для ТЗ в ТЗ
- 1c77 и 1с8!Нужно загрузить данные СЗВК из 1с77 ЗиК в 1с8 УПП! Есть какие-нибудь
- Ошибка при работе через терминальную сессию в 1С8. Вылетает 1с8.exe!
- Как получить Фамилию ФизЛица в родительном падеже в 1С8.0 или 1С8.1?
- Опять немогу снести 1с8. и переставить. из-за того что 1с8.1 стояла
- 1С8 Как зписать ТЗ в Ексель ..?
- Отражение в БУ и НУ страховых взносов на начисления не принимаемые к НУ
- Запуск через ярлык 1С8.2 базы 1С8.1
- Конвертация 1с8 в 1с8.1
В этой группе 1С
- Ценообразование в УТ 10.3 (ди
- Многопоточный тест производительности 1с
- Вызов web-сервисов 1С из SAPа
- СКД: Ошибка "РегистрСведений....Несоответствие типов (Параметр номер ""1"")
- Переход УТ10 - УТ11 на что обратить внимание?
- ПоказатьОповещениеПользователя() Увеличить шрифт, изменить координаты
- ЗУП 8 Не обновляются "Мои задачи"
- Подскажите плз, как в 1С отловить событие удаления объекта?
- Как очистить регистры сведений?
- Написание инструкций к конфигурации
- Как перевести строку на русском из HTML-кодов
- Выгрузка Списания товаров из УТ 11 в БП 2
- Как программно добавить колонки в макет?
- v8: ЗУП В Списке отпусков организации отпуск есть. А у сотрудниках в истории отпуска нет
- Как добавить в отчет Оборотно-сальдовая ведомость
- Точка останова в регламентном задании
- Настройка прав в РИБ
- Закрытие 60 счета. Остатки есть и по 60.1 и по 60.2
- Программно очистить значения реквизитов в форме записи регистра сведений
- Восстановление по УИД