Имя: Пароль:
1C
1С v8
Как загрузить в SQL базу из 1С большое количество строк
0 TDI
 
13.03.20
07:28
Сейчас делается в цикле, через выполнение запросов
INSERT INTO [---]
Но часто и связь почему то прерывается (с sql сервером), приходится заново запускать. Да и мне кажется что не оптимальный это способ.
Подскажите, какие еще есть способы, более оптимальные, для добавления записей на sql сервер ?
1 Sserj
 
13.03.20
07:31
insert into самый оптимальный, только делай его не по одной строчке а собирай в цикле большой сразу строк на тысячу, чтобы получишь соответственно ускорение в 1000 раз.
2 acht
 
13.03.20
07:56
(0) google://bulk+insert
3 rphosts
 
13.03.20
07:57
(2) +индексы видимо снести а после загрузки создать (если это разовая загрузка).

А что сразу не напрямую SQL -> SQL?
4 Bigbro
 
13.03.20
08:01
https://docs.microsoft.com/ru-ru/sql/t-sql/statements/insert-transact-sql?view=sql-server-ver15
ну если по одной строке инсертить то да неоптимально.
5 TDI
 
13.03.20
08:19
(1) пишется по 50 строк.
Т. К. Когда в строке формируется запрос, видимо есть какое то ограничение по длине строки, и запрос может весь не влезть..
6 DrZombi
 
гуру
13.03.20
08:22
(5) А как вы пишите?
Через АДО?
7 DrZombi
 
гуру
13.03.20
08:26
(5)   Смотрите Длина строки, содержащей инструкции SQL в статье:

Длина строки, содержащей инструкции SQL (размер пакета)        65 536 * размер сетевого пакета    Размер сетевого пакета — это размер пакетов потока табличных данных (TDS), которые используются для связи между приложениями и компонентом Компонент Database Engine. По умолчанию размер пакета равен 4 КБ, а его настройка осуществляется с помощью параметра конфигурации network packet size.

https://docs.microsoft.com/ru-ru/sql/sql-server/maximum-capacity-specifications-for-sql-server?redirectedfrom=MSDN&view=sql-server-ver15
8 DrZombi
 
гуру
13.03.20
08:28
9 DrZombi
 
гуру
13.03.20
08:30
придется вам все же создать на SQL...


Создание определяемых пользователем функций (компонент Database Engine)
https://docs.microsoft.com/ru-ru/sql/relational-databases/user-defined-functions/create-user-defined-functions-database-engine?view=sql-server-ver15
10 DrZombi
 
гуру
13.03.20
08:32
А так, скрипт вам ненужен, просто надо подготовить файлики и загрузить их.

Массовый импорт и экспорт данных (SQL Server)
https://docs.microsoft.com/ru-ru/sql/relational-databases/import-export/bulk-import-and-export-of-data-sql-server?view=sql-server-ver15#MethodsForBuliIE
11 DrZombi
 
гуру
13.03.20
08:35
+ А нет, можно и через скрипт :)

46. Массовый импорт и экспорт данных в SQL Server

Методы
SQL Server поддерживает массовый экспорт данных из таблиц SQL. Server и массовый импорт данных в таблицы или несекционированные представления SQL Server.Доступны следующие основные методы.

BULK INSERT, инструкция (импортирует)- Инструкция Transact-SQL, импортирующая данные непосредственно из файла данных в таблицу базы данных или несекционированное представление.
Инструкция INSERT ...SELECT * FROM OPENROWSET(BULK...). (импортирует)- Инструкция Transact-SQL, использующая поставщик больших наборов строк OPENROWSET для массового импорта данных в таблицу SQL Server с помощью функции OPENROWSET(BULK...), применяющейся для выборки данных в предложение INSERT.
cp, программа (импортирует и экспортирует) - Программа командной строки (Bcp.exe), массово экспортирующая и импортирующая данные и создающая файлы форматирования.


https://github.com/Panda-Lewandowski/DataBase/wiki/46.-Массовый-импорт-и-экспорт-данных-в-SQL-Server
12 DrZombi
 
гуру
13.03.20
08:38
13 DrZombi
 
гуру
13.03.20
08:42
(0)Вам в (12)
14 Йохохо
 
13.03.20
08:58
(13) ОФФ. а ты сам пробовал? SQL Server Data Tools надо ставить?
15 DrZombi
 
гуру
13.03.20
09:15
(14) Мне было любопытно, есть ли ограничение, и что сделать ,что бы его обойти.

1. Ограничение на скрипт есть
2. Обойти его нельзя, т.е. настройки ограничены
3. Есть методы у SQL, загрузки из файла. (надо делать го гуглить - для ТС)
4. Моё личное любопытство удовлетворяет ссылка в (12).

п.с. для ТС самому решать, как быть...
16 nicxxx
 
13.03.20
10:48
(0) "Но часто и связь почему то прерывается (с sql сервером), приходится заново запускать" - дичь. Не должна рваться связь, хоть ты миллиард инсертов делаешь. Тут к админам вопрос, что там с сетью происходит. Может у вас SQL и 1С через 50 коммутаторов подключаются? :)
17 pechkin
 
13.03.20
10:50
(3) только не снести, а отключить
18 nicxxx
 
13.03.20
10:51
(1) золотые слова. а еще begin tran надо добавить, так еще немного быстрее будет
19 TDI
 
13.03.20
16:37
Спасибо за ответы.
Ещё попутный вопрос, как (если говорить что строки в цикле записываются) сделать все записи в одной транзакции.
А-то получается что выгрузка идет около 15 минут, и иногда пользователь может зайти, и увидеть "половинчатые" данные.
Как это в одной транзакции сделать ?
begin tran
commit tran
я как понимаю только для текущего пакета записей будут работать, но не для всей выгрузки..
20 arsik
 
гуру
13.03.20
16:43
(19) Заполняйте сначала временную таблицу, как ее заполнили все из нее в рабочую.
21 Fragster
 
гуру
13.03.20
16:50
Подключаем внешний источник данных и пихаем в него набор записей. дальше 1с сама разберется
22 arsik
 
гуру
13.03.20
16:52
(21) Программно? Я вроде помню, что внешний источник только в конфигураторе можно.
23 TDI
 
13.03.20
16:52
(21) да, чтото про внешний источник забыл..
так это вообще всю выгрузку получается через этот объект можно сделать ?
24 Fragster
 
гуру
16.03.20
13:20
(23) да
25 Fragster
 
гуру
16.03.20
13:21
(22) в конфигураоре, да
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.