powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel > Recordset > MSSQL
5 сообщений из 5, страница 1 из 1
Excel > Recordset > MSSQL
    #39774283
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то не могу понять:
Пользователь запускает макрос, нажимает загрузить данные (excel определенного формата, артикула идут вниз, недели в столбцы и данные)
Пример Excel
Артикул 201801201802201803201804201805201806201807123121212112410131111251222422

Результат в таблице на сервере
Артикул неделя данные123 201801 1123 201802 2123 201803 1123201804 2123 201805 1123 201806 2123 201807 1

Я реализовал это через 2 Recordset с подключением к серверу и к листу excel и дальше перебираю данные в Recordset excel и добавляю данные в Recordset сервера.
Мне надо получить максимальную производительность, необходимо вставить около 1 000 000 строк, можете, что-нибуть подсказать?
*insert into дольше получается, так как данные из Excel необходимо форматировать под mssql
Я сначала подумал проблема в настройках, поставил LockType = adLockBatchOptimistic, но в таком случае он не вставляет данные в таблицу.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    
...
Do While Not rs_ex.EOF
                For c = 1 To rs_ex.fields.count - 1
                        DoEvents
                        rs_sql.addnew
                        rs_sql.fields("Артикул").value = rs_ex.fields("Артикул").value
                        rs_sql.fields("неделя").value = rs_ex.fields(c).name
                        rs_sql.fields("данные").value = rs_ex.fields(c).value
                Next
                rs_ex.MoveNext
Loop
...
...
Рейтинг: 0 / 0
Excel > Recordset > MSSQL
    #39774295
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FochaЯ сначала подумал проблема в настройках, поставил LockType = adLockBatchOptimistic, но в таком случае он не вставляет данные в таблицу.
Вот это должно быть, после всех добавлений
Код: vbnet
1.
rs_sql.UpdateBatch


И делай клиентский курсор для rs_sql
FochaМне надо получить максимальную производительность
Максимальную с "переливанием" из рекордсета в рекордсет никогда не получишь ...
Если есть возможность создавать объекты на сервере, то можно было бы создать ХП, в которую передать rs_ex сериализованный в XML, и в этой ХП его загрузить ... - вот это было бы быстро ...

Ну и совсем идеально (и быстро) было бы через запрос OpenRowset к Экселю
...
Рейтинг: 0 / 0
Excel > Recordset > MSSQL
    #39774327
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
courtВот это должно быть, после всех добавлений
Код: vbnet
1.
rs_sql.UpdateBatch


Понял, теперь обновляется, спасибо

courtИ делай клиентский курсор для rs_sql

Делаю именно так

courtМаксимальную с "переливанием" из рекордсета в рекордсет никогда не получишь ...
Если есть возможность создавать объекты на сервере, то можно было бы создать ХП, в которую передать rs_ex сериализованный в XML, и в этой ХП его загрузить ... - вот это было бы быстро ...

передать rs_ex сериализованный в XML - это как, создать xml и отправить на сервер?
я пробовал так, после создания xml в VBA использовал xpath, он тратит много времени на преобразование xml и вставку, в таблице есть индексы
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    sql = ""
    sql = sql & Chr(10) & "declare @xml xml; set @xml = '" & doc.xml & "'"
    sql = sql & Chr(10) & "insert into table"
    sql = sql & Chr(10) & "SELECT"
    sql = sql & Chr(10) & "        [dt] = Node.Data.value('@Артикул', 'varchar(50)')"
    sql = sql & Chr(10) & "       ,[warehouse] = Node.Data.value('@неделя', 'dec(6,0)')"
    sql = sql & Chr(10) & "       ,[article_color] = Node.Data.value('@данные', 'smallint')"
    sql = sql & Chr(10) & "FROM @xml.nodes('//rows/row') Node(Data)"

    cn.Execute (sql)



courtНу и совсем идеально (и быстро) было бы через запрос OpenRowset к Экселю

Прав не хватает, так как файл должен быть на сервере
...
Рейтинг: 0 / 0
Excel > Recordset > MSSQL
    #39774329
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
   sql = ""
    sql = sql & Chr(10) & "declare @xml xml; set @xml = '" & doc.xml & "'"
    sql = sql & Chr(10) & "insert into table"
    sql = sql & Chr(10) & "SELECT"
    sql = sql & Chr(10) & "        [article] = Node.Data.value('@Артикул', 'varchar(50)')"
    sql = sql & Chr(10) & "       ,[yyyyww] = Node.Data.value('@неделя', 'dec(6,0)')"
    sql = sql & Chr(10) & "       ,[plan] = Node.Data.value('@данные', 'smallint')"
    sql = sql & Chr(10) & "FROM @xml.nodes('//rows/row') Node(Data)"

    cn.Execute (sql)
...
Рейтинг: 0 / 0
Excel > Recordset > MSSQL
    #39774352
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fochaпередать rs_ex сериализованный в XML - это как, создать xml и отправить на сервер?
я пробовал так, после создания xml в VBA использовал xpath, он тратит много времени на преобразование xml и вставку, в таблице есть индексы
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    sql = ""
    sql = sql & Chr(10) & "declare @xml xml; set @xml = '" & doc.xml & "'"
    sql = sql & Chr(10) & "insert into table"
    sql = sql & Chr(10) & "SELECT"
    sql = sql & Chr(10) & "        [dt] = Node.Data.value('@Артикул', 'varchar(50)')"
    sql = sql & Chr(10) & "       ,[warehouse] = Node.Data.value('@неделя', 'dec(6,0)')"
    sql = sql & Chr(10) & "       ,[article_color] = Node.Data.value('@данные', 'smallint')"
    sql = sql & Chr(10) & "FROM @xml.nodes('//rows/row') Node(Data)"

    cn.Execute (sql)

Да, примерно об этом я и писал (только всё было бы в ХП, но это не суть важно ...)

Так, а "тратит много времени" - на выполнение этого запроса, или, всё таки, на создание XML-я ?
Создаете XML как ? через метод рекордсета Save ? Типа этого :
Код: vbnet
1.
rs.Save ... , adPersistXML 


?
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel > Recordset > MSSQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]