powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
22 сообщений из 72, страница 3 из 3
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
    #39523806
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxGerasimenko,
что в моём случае будет источником данных для OPENROWSET?
Функция OPENROWSET(BULK…)
Доступ к поставщику группового набора строк OPENROWSET производится через вызов функции OPENROWSET с указанием параметра BULK. Функция OPENROWSET(BULK…) обеспечивает доступ к удаленным данным, производя подключение к удаленному источнику данных, например файлу данных, через поставщик OLE DB.
Чтобы импортировать групповые данные, вызовите функцию OPENROWSET(BULK…) из предложения SELECT…FROM инструкции INSERT. Основной синтаксис массового импорта данных:
INSERT ... SELECT * FROM OPENROWSET(BULK...)
При использовании инструкции INSERT функция OPENROWSET(BULK...) поддерживает табличные подсказки. Кроме обычных табличных подсказок, вроде TABLOCK, предложение BULK принимает следующие специальные табличные подсказки: IGNORE_CONSTRAINTS (не учитывается только ограничения CHECK), IGNORE_TRIGGERS, KEEPDEFAULTS и KEEPIDENTITY. Дополнительные сведения см. в разделе Табличные подсказки (Transact-SQL).
Сведения о дополнительном использовании параметра BULK см. в разделе OPENROWSET (Transact-SQL).

Выбирай, что тебе подходит: https://technet.microsoft.com/ru-ru/library/ms190312(v=sql.105).aspx (см примеры)
...
Рейтинг: 0 / 0
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
    #39523829
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerasimenko,

1. если бы я знал, что мне подходит, я бы уже выбрал
2. как я уже говорил, у меня нет доступа к серверу, а с сервера нет доступа к моим ресурсам
...
Рейтинг: 0 / 0
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
    #39523835
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxGerasimenko,

1. если бы я знал, что мне подходит, я бы уже выбрал
2. как я уже говорил, у меня нет доступа к серверу, а с сервера нет доступа к моим ресурсам
Ты как партизан не говоришь, что является первоначальным источником данных. Датасет - вторичен.
Как вариант, сохранить файл в блоб на серверу, с сервера развернуть в начальный вид и использовать далее по ссылке...
...
Рейтинг: 0 / 0
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
    #39523843
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
первичный источник данных один из следующих, любой:
- эксель
- запрос из оракла
- dbf-файл
- db-файл
- запрос из dbf-файла
- запрос из db-файла
- запрос из mssql
- запрос посредством ADO
- запрос из IB/FB
...
Рейтинг: 0 / 0
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
    #39523856
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxпервичный источник данных один из следующих, любой:
- эксель
- запрос из оракла
- dbf-файл
- db-файл
- запрос из dbf-файла
- запрос из db-файла
- запрос из mssql
- запрос посредством ADO
- запрос из IB/FB
т.е. ту часть, что нельзя линковать, можно слить через блоб, остальную через линковку.
Если универсальный: то сохранять результаты как csv файл (возможно заархивированный) и сливать на сервер через блоб, если другого выхода нет.
Ограничение: varbinary [( n | max)] двоичные данные переменной длины. nможет иметь значение от 1 до 8000.
...
Рейтинг: 0 / 0
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
    #39523874
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вместо varbinary можно использовать image.
Те же яйца, только ограничения другие...
...
Рейтинг: 0 / 0
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
    #39530289
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tunknownandreymxили выбросить бинды и передавать данные литералами?
...о многократном разборе?


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
INSERT Analytics.DBO.TMP_sap1 (
TYPE_REQUEST,
ID,
TITLE,
DESCRIPTION,
STATUS,
PRIORITY,
SUPPORT_GROUP,
SUPPORT_GROUP_NAME,
CREATED_DATE,
FIRST_ASSIGNED_DATE,
REACTION_TIME,
STATUS_SLA_REACTION,
RESOLVED_DATE,
CLOSED_DATE,
RESOLVED_TIME,
STATUS_SLA_RESOLVED,
RATING,
BUSINESS_SERVICE,
cat1,
cat2,
cat3
)
select :0,:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17,:18,:19,:20
union all select :21,:22,:23,:24,:25,:26,:27,:28,:29,:30,:31,:32,:33,:34,:35,:36,:37,:38,:39,:40,:41
union all select ...


примерно так сделал
скорость раз в 15 меньше, чем булк инсерт в Оракле, но терпимо
...
Рейтинг: 0 / 0
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
    #39531248
tunknown
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxскорость раз в 15 меньше, чем булк инсерт в Оракле, но терпимоИзмерялось общее время или длительность самого insert через profiler?

Интересно, насколько быстр массовый биндинг на стороне DB-компонента/OLEDB провайдера?
...
Рейтинг: 0 / 0
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
    #39531394
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxДанные именно из Делфи, в другом месте их нет
Очень заинтересовало, подскажите пожалуйста, в каком месте хранит Delphi данные, может пригодится.
...
Рейтинг: 0 / 0
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
    #39531414
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2andreymxДанные именно из Делфи, в другом месте их нет
Очень заинтересовало, подскажите пожалуйста, в каком месте хранит Delphi данные, может пригодится.в результате запроса, в dataset'e

ЗЫ: Надеюсь, что помог
...
Рейтинг: 0 / 0
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
    #39531418
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxв результате запроса, в dataset'e
Понятно, я уж думал delphi научился хранить данные. :)
Ваш датасет берет данные откуда то, верно? А потом эти данные хочет закинуть на сервер, т.е. является посредником, правильно я понял?
Тут речь не о хранении данных в delphi а об их обработки (надеюсь, это не визуальный интерфейс, типа АРМ, который даёт пользователю сотни тыс.строк данных) этих данных.

Вариант плановой задачи по загрузки данных на самом MS SQL сервере не рассматривался? Напрямую, без использования delphi и прочих сред?
...
Рейтинг: 0 / 0
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
    #39531436
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,
В случае, если решено использовать приложение как посредника, надо четко понять - это в любом случае цикл с перебором всех строк и инсертом на каждую строку.

Для этой операции нет необходимости к Table / Query прикручивать DataSource т.е. использовать визуализацию.
Самый простой вариант:
Открываем (можно даже динамически, в теле процедуры создать) пару таблиц, одна поднимет данные ваши, вторая подключиться к MS SQL и эти таблицы могут быть разные, т.е. одна может быть обычной TTable / TQuery вторая из ADO.
Можно попробовать TBatchMove...
Вообще, вся задача сводится к выполнению скрипта insert :) Какими бы средствами не пользовались, хоть cmd файлом.
Но, одномоментная заливка сотен тысяч записей на сервер в любом случае будет его просаживать, и это владельцы сервера заметят.
...
Рейтинг: 0 / 0
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
    #39531488
Uridian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymxкак наиболее быстро залить данные из Delphi 7 (датасет, массив) в таблицу MS SQL? Скажем, 100-300 тыс строк
Данные именно из Делфи, в другом месте их нет
IRowsetFastLoad (OLE DB)
...
Рейтинг: 0 / 0
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
    #39531564
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2andreymx,
В случае, если решено использовать приложение как посредника, надо четко понять - это в любом случае цикл с перебором всех строк и инсертом на каждую строку.

Для этой операции нет необходимости к Table / Query прикручивать DataSource т.е. использовать визуализацию.
Самый простой вариант:
Открываем (можно даже динамически, в теле процедуры создать) пару таблиц, одна поднимет данные ваши, вторая подключиться к MS SQL и эти таблицы могут быть разные, т.е. одна может быть обычной TTable / TQuery вторая из ADO.
Можно попробовать TBatchMove...
Вообще, вся задача сводится к выполнению скрипта insert :) Какими бы средствами не пользовались, хоть cmd файлом.
Но, одномоментная заливка сотен тысяч записей на сервер в любом случае будет его просаживать, и это владельцы сервера заметят.спасибо за советы

ЗЫ: в MSSQL сотни тысяч строк ещё не вставлял, но в Оракл из Экселя 300 тыс строк - аж бегом
Появляются время от времени такие разовые задачи
...
Рейтинг: 0 / 0
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
    #39531572
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Uridianandreymxкак наиболее быстро залить данные из Delphi 7 (датасет, массив) в таблицу MS SQL? Скажем, 100-300 тыс строк
Данные именно из Делфи, в другом месте их нет
IRowsetFastLoad (OLE DB) тут уже обсуждали, http://www.sql.ru/forum/707391-1/irowsetfastload

спасибо
если в отпуске будет время, пороюсь
...
Рейтинг: 0 / 0
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
    #39531679
MKZM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в чем проблема?
...
Рейтинг: 0 / 0
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
    #39531815
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MKZMА в чем проблема?уточни вопрос, плз
...
Рейтинг: 0 / 0
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
    #39531838
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxUridianпропущено...

IRowsetFastLoad (OLE DB) тут уже обсуждали, http://www.sql.ru/forum/707391-1/irowsetfastload

спасибо
если в отпуске будет время, пороюсьположу сюда еще ссылку
https://gist.github.com/tondrej/bc12fdf82ad04d6738df8c2d50459231
...
Рейтинг: 0 / 0
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
    #39541241
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потихоньку разбираюсь с примером https://gist.github.com/tondrej/bc12fdf82ad04d6738df8c2d50459231
переписываю на делфи 7
Не все данные выгружаются, а только те, которые прописаны разрабом явно
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
    case Field.DataType of
      ftBCD, ftCurrency:
        PCurrency(@Column.Data[0])^ := Field.AsCurrency;
      ftDate:
        with PDBDate(@Column^.Data[0])^ do
          DecodeDate(Field.AsDateTime, Word(year), month, day);
      ftTime:
        with PDBTime(@Column^.Data[0])^ do
          DecodeTime(Field.AsDateTime, hour, minute, second, MSec);
      ftDateTime, ftTimeStamp:
        with PDBTimeStamp(@Column^.Data[0])^ do
        begin
          DecodeDate(Field.AsDateTime, Word(year), month, day);
          DecodeTime(Field.AsDateTime, hour, minute, second, MSec);
          fraction := MSec * 1000000;
        end;
      else
        Field.GetData(@Column^.Data[0], False);
    end;
    Column^.Status := DBSTATUS_S_OK;
    case Field.DataType of
      ftString, ftMemo:
        Column^.Length := StrLen(PAnsiChar(@Column^.Data[0]));
      ftWideString, ftWideMemo:
        Column^.Length := StrLen(PWideChar(@Column^.Data[0])) * SizeOf(WideChar);
      else
        Column^.Length := Field.DataSize;
    end;

выгрузка ftDateTime заработала сразу


Выгрузку ftFloat сделал так, данные вроде выгружаются без ошибок:
Код: pascal
1.
2.
      ftFloat:
        PDouble(@Column.Data[0])^ := Field.AsFloat;


что делать со стрингами, вообще не представляю, знаний не хватает.
Пробовал так, но в БД садится всякая хрень
Код: pascal
1.
2.
3.
4.
5.
      ftString, ftMemo:
        begin
          Column^.Length := StrLen(PAnsiChar(field.AsString));
          PPAnsiChar(@Column.Data[0])^ := PAnsiChar(field.AsString);
        end;

в таблице делал поля и varchar, и nvarchar
...
Рейтинг: 0 / 0
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
    #39541539
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxв Оракл из Экселя 300 тыс строк - аж бегома чем уж вставляешь если не секрет? я файрдаком батч (правда не такой жирный) пуляю и если ошибок нет то весьма шустро
...
Рейтинг: 0 / 0
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
    #39548000
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь ещё неплохой пример, на итальянском правда
http://fsoriano.developpez.com/articles/db/oledb/delphi/

Только не могу скачать исходники
Или доступа нету, или "протухли"
ftp://ftp-developpez.com/fsoriano/archives/etw/delphi/fichiers/etw-sources.zip
http://fsoriano.developpez.com/articles/db/oledb/delphi/fichiers/oledb-sources.zip
http://fsoriano.developpez.com/articles/db/oledb/delphi/fichiers/oledb.docx
...
Рейтинг: 0 / 0
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
    #39548014
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вроде получилось, тестирую
выгрузка 100 тыс строк идёт около 40 сек, что вполне нормально для моих целей
проверял на типах данных
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
    case Field.DataType of
      ftInteger:
        PInteger(@Column.Data[0])^ := Field.AsInteger;
      ftBCD, ftCurrency:
        PCurrency(@Column.Data[0])^ := Field.AsCurrency;
      ftFloat:
        PDouble(@Column.Data[0])^ := Field.AsFloat;
      ftDate:
        with PDBDate(@Column^.Data[0])^ do
          DecodeDate(Field.AsDateTime, Word(year), month, day);
      ftTime:
        with PDBTime(@Column^.Data[0])^ do
          DecodeTime(Field.AsDateTime, hour, minute, second, MSec);
      ftDateTime, ftTimeStamp:
        with PDBTimeStamp(@Column^.Data[0])^ do
        begin
          DecodeDate(Field.AsDateTime, Word(year), month, day);
          DecodeTime(Field.AsDateTime, hour, minute, second, MSec);
          fraction := MSec * 1000000;
        end;
      ftString, ftMemo:
        begin
          stringValue := field.AsString;
          Column^.Length := length(stringValue);
          move(stringValue[1], Column^.Data[0], Column^.Length);

осталось разобраться с порядками полей запросе и таблице, т.к. привязка идёт не по имени, а, похоже, как раз по порядку полей в таблице
...
Рейтинг: 0 / 0
22 сообщений из 72, страница 3 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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