Имя: Пароль:
IT
1C 7.7
v7: Как одним запросом вставить несколько строк в таблицу SQlite
0 FobusVGrunt
 
06.06.16
16:15
Нужно добавлять строки в таблицу, метод УложитьТЗ не катит, он удаляет таблицу перед добавлением. делать в цикле по одной строке "INSERT", очень медленно. Пробовал "INSERT INTO a_L_S47 (IDOLD,ID) VALUES (1,2),(100,200),....". Выдает ошибку на синтаксис ",". Как в SQLite одним запросом можно добавить много строк?
1 Волшебник
 
модератор
06.06.16
16:17
SQLite не умеет вставлять несколько строк
2 Sserj
 
06.06.16
16:19
http://www.sqlite.org/lang_insert.html

выдает правильную ошибку, скорей всего лишняя запятая после последних скобок валуесов.
3 FobusVGrunt
 
06.06.16
16:21
(1) В 1С-ке, выдает ошибку, а через SQLiteExpert, без вопросов работает
4 FobusVGrunt
 
06.06.16
16:25
"INSERT INTO a_L_S47 (IDOLD,ID) VALUES (1,2),(100,200)" - в SQLiteExpert добавляет две строки, через 1С, точно такой запрос пишет:  <near ",": syntax error>
5 youalex
 
06.06.16
16:32
(0)
insert into [test] ([f1])
select 1
union  select 2;
6 Chieftain
 
06.06.16
16:33
(0) УложитьТЗ + Insert Into Select From
7 FobusVGrunt
 
06.06.16
16:35
(5) Спасибо, так уже попробовал работает с 1С, но интересно чего один и тот же запрос в одной программе работает, а во второй нет
8 FobusVGrunt
 
06.06.16
16:37
(6) имеется ввиду уложить во временную, а потом от туда в основную?
9 Chieftain
 
06.06.16
16:39
(8) да, как вариант
10 FobusVGrunt
 
06.06.16
16:55
походу остается только как в (6), в (5) - есть ограничения походу на кол-во SELECT в запросе, так если много записей выдает ошибку (too many terms in compound  SELECT)
11 Chieftain
 
06.06.16
17:02
(10) Можно разбить по 500 записей))
12 FobusVGrunt
 
06.06.16
17:16
(11) Неее оптимально в (6). Скинул во временную таблицу, если транзакция успешная скопировал в основную.
13 Djelf
 
06.06.16
17:38
(0) Движок sqlite в 1sqlite 1.0.2.6 - 3.7.10, а поддержка вставки нескольких строк была добавлена в движке 3.7.11
14 trdm
 
06.06.16
17:59
BEGIN;
INSERT INTO a_L_S47 (IDOLD,ID) VALUES (1),(100);
INSERT INTO a_L_S47 (IDOLD,ID) VALUES (2),(200);
COMMIT;
15 trdm
 
06.06.16
18:04
Query succeeded:
create table a_L_S47 (IDOLD int ,ID int)
Query succeeded:
BEGIN;
INSERT INTO a_L_S47 (IDOLD,ID) VALUES (1),(100); INSERT INTO a_L_S47 (IDOLD,ID) VALUES (2),(200);
COMMIT;
-- Нормально пашет.
16 FobusVGrunt
 
06.06.16
22:24
(15) по синтаксису значения в одних скобках должны быть не "VALUES (1),(100)", а "VALUES (1,100)"
17 FobusVGrunt
 
06.06.16
22:25
(15) и у меня что-то не пашет, эта конструкция
18 FobusVGrunt
 
06.06.16
22:25
(13) Спасибо, теперь понятно почему в 1С  не работает такая конструкция
19 Djelf
 
06.06.16
23:38
(12) Решение правильное. Самый быстрый способ!
Хинт - разбивать на порции ~10000 строк (подбирать в зависимости от объема 1й строки).
Тогда можно и вывести какой то прогрессбарчик и работает быстрее.
20 trdm
 
07.06.16
07:53
(17) Да, не пашет.
пользовался приблудой типа QA - она по синтаксису прошла, но дело не сделала.
21 trdm
 
07.06.16
07:56
да и конструкция
BEGIN;
INSERT INTO a_L_S47 (IDOLD,ID) VALUES (1,100);
INSERT INTO a_L_S47 (IDOLD,ID) VALUES (2,200);
COMMIT;

вставляет 1 строку через QA. Хрень какая-то..
22 FobusVGrunt
 
07.06.16
13:41
(21) Что такое QA ?
23 Ёпрст
 
07.06.16
14:01
(22) квери анализёр
24 Djelf
 
07.06.16
23:26
(21) Да, есть такое! Обрабатывается только первый запрос перед ';'
Мастер чуток недокурил интерфейс. sqlite3_prepare_v2 надо запускать в цикле т.к. он кушает только 1 запрос за проход. Ну а поскольку мне это не нравится то

database.cpp в void SQLiteQuery::prepare(const CString& query)
    //{ Djelf
    //- const char* pTail;
    //- CString prep_error;
    //- int res = sqlite3_prepare_v2(m_pParent->base(), u8strQuery, u8strQuery.GetLength(), &m_pStmt, &pTail);

    const char* pTail = NULL;
    CString prep_error;

    int res = SQLITE_OK;
    while( u8strQuery[0] && (SQLITE_OK == res) ){
        res = sqlite3_prepare_v2(m_pParent->base(), u8strQuery, -1, &m_pStmt, &pTail);
        u8strQuery=pTail;
    }
    //} Djelf

Фиксед!
1sqlite 3.8.11.bf8 https://cloud.mail.ru/public/86LY/qr1G1waT5

Расшифровка explain для 2х запросов подряд не работает. Буду думать.
25 Chieftain
 
08.06.16
00:20
(24) чую со ссылочкой ты ошибся, по теме Tool_1CD вообще никаким боком
26 Djelf
 
08.06.16
01:21
(25) А при чем тут вообще Tool_1CD? оО
Это относится к 1sqlite.
Было в (21) удивление про хрень. Хрень была изучена и частично излечена.
Не попал ответом в заголовок темы, но попал в ответвление от вопроса.
Что не так?
27 Chieftain
 
08.06.16
02:31
(26) Из твоего поста следует, что ты изучил проблему, нашел ей решение. Есть смысл полагать, что ты качнул с репа исходники, поправил и собрал. Написал "Фиксед!1sqlite 3.8.11.bf8" и указал ссылку. Но ссылка твоя ведет почему-то на скачивание "Tool_1CD.zip".
Так что все так!
28 Djelf
 
08.06.16
02:45
Ой... Спасибо!
Ну так бы сразу и написал, а то я голову ломаю...
дабл фиксед ;)
https://cloud.mail.ru/public/9AU9/arRAT8Xx6

P.S. после последней ';' ни пробелов ни комментариев быть не должно. Заметил только сейчас, возможно завтра доделаю, чтобы не влияло.
29 trdm
 
08.06.16
12:58
(24) Я пользуюсь чуток доработанным примером QA из этой книжки:
https://www.ozon.ru/context/detail/id/4030253/

https://yadi.sk/d/vikpGmjzsLnuw
30 Djelf
 
08.06.16
15:24
(29) А я подумал QA в 1с`ке.

Эх... рано радовался. В варианте (24) выполняется только последний запрос. Надо рисовать хранение и обработку всей цепочки подготовленных запросов. Это займет какое то время.