Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4331
andreymx
Gerasimenko,
что в моём случае будет источником данных для 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 (см примеры)
20 сен 17, 16:03    [20809438]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 43618
Gerasimenko,

1. если бы я знал, что мне подходит, я бы уже выбрал
2. как я уже говорил, у меня нет доступа к серверу, а с сервера нет доступа к моим ресурсам
20 сен 17, 16:27    [20809522]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4331
andreymx
Gerasimenko,

1. если бы я знал, что мне подходит, я бы уже выбрал
2. как я уже говорил, у меня нет доступа к серверу, а с сервера нет доступа к моим ресурсам

Ты как партизан не говоришь, что является первоначальным источником данных. Датасет - вторичен.
Как вариант, сохранить файл в блоб на серверу, с сервера развернуть в начальный вид и использовать далее по ссылке...
20 сен 17, 16:36    [20809545]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 43618
первичный источник данных один из следующих, любой:
- эксель
- запрос из оракла
- dbf-файл
- db-файл
- запрос из dbf-файла
- запрос из db-файла
- запрос из mssql
- запрос посредством ADO
- запрос из IB/FB
20 сен 17, 16:41    [20809568]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4331
andreymx
первичный источник данных один из следующих, любой:
- эксель
- запрос из оракла
- dbf-файл
- db-файл
- запрос из dbf-файла
- запрос из db-файла
- запрос из mssql
- запрос посредством ADO
- запрос из IB/FB

т.е. ту часть, что нельзя линковать, можно слить через блоб, остальную через линковку.
Если универсальный: то сохранять результаты как csv файл (возможно заархивированный) и сливать на сервер через блоб, если другого выхода нет.
Ограничение: varbinary [( n | max)] двоичные данные переменной длины. nможет иметь значение от 1 до 8000.
20 сен 17, 16:54    [20809606]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4331
вместо varbinary можно использовать image.
Те же яйца, только ограничения другие...
20 сен 17, 17:10    [20809662]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 43618
tunknown
andreymx
или выбросить бинды и передавать данные литералами?
...о многократном разборе?


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 меньше, чем булк инсерт в Оракле, но терпимо
3 окт 17, 16:23    [20839486]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
tunknown
Member

Откуда:
Сообщений: 419
andreymx
скорость раз в 15 меньше, чем булк инсерт в Оракле, но терпимо
Измерялось общее время или длительность самого insert через profiler?

Интересно, насколько быстр массовый биндинг на стороне DB-компонента/OLEDB провайдера?
5 окт 17, 09:56    [20844292]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
stells2
Member

Откуда: Оклахома Пригород Колымы
Сообщений: 447
andreymx
Данные именно из Делфи, в другом месте их нет

Очень заинтересовало, подскажите пожалуйста, в каком месте хранит Delphi данные, может пригодится.
5 окт 17, 12:31    [20845003]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 43618
stells2
andreymx
Данные именно из Делфи, в другом месте их нет

Очень заинтересовало, подскажите пожалуйста, в каком месте хранит Delphi данные, может пригодится.
в результате запроса, в dataset'e

ЗЫ: Надеюсь, что помог
5 окт 17, 12:44    [20845086]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
stells2
Member

Откуда: Оклахома Пригород Колымы
Сообщений: 447
andreymx
в результате запроса, в dataset'e

Понятно, я уж думал delphi научился хранить данные. :)
Ваш датасет берет данные откуда то, верно? А потом эти данные хочет закинуть на сервер, т.е. является посредником, правильно я понял?
Тут речь не о хранении данных в delphi а об их обработки (надеюсь, это не визуальный интерфейс, типа АРМ, который даёт пользователю сотни тыс.строк данных) этих данных.

Вариант плановой задачи по загрузки данных на самом MS SQL сервере не рассматривался? Напрямую, без использования delphi и прочих сред?
5 окт 17, 12:52    [20845110]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
stells2
Member

Откуда: Оклахома Пригород Колымы
Сообщений: 447
andreymx,
В случае, если решено использовать приложение как посредника, надо четко понять - это в любом случае цикл с перебором всех строк и инсертом на каждую строку.

Для этой операции нет необходимости к Table / Query прикручивать DataSource т.е. использовать визуализацию.
Самый простой вариант:
Открываем (можно даже динамически, в теле процедуры создать) пару таблиц, одна поднимет данные ваши, вторая подключиться к MS SQL и эти таблицы могут быть разные, т.е. одна может быть обычной TTable / TQuery вторая из ADO.
Можно попробовать TBatchMove...
Вообще, вся задача сводится к выполнению скрипта insert :) Какими бы средствами не пользовались, хоть cmd файлом.
Но, одномоментная заливка сотен тысяч записей на сервер в любом случае будет его просаживать, и это владельцы сервера заметят.
5 окт 17, 13:17    [20845191]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
Uridian
Member

Откуда: Lobnya
Сообщений: 205
andreymx
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в таблицу MS SQL? Скажем, 100-300 тыс строк
Данные именно из Делфи, в другом месте их нет

IRowsetFastLoad (OLE DB)
5 окт 17, 14:14    [20845417]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 43618
stells2
andreymx,
В случае, если решено использовать приложение как посредника, надо четко понять - это в любом случае цикл с перебором всех строк и инсертом на каждую строку.

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

ЗЫ: в MSSQL сотни тысяч строк ещё не вставлял, но в Оракл из Экселя 300 тыс строк - аж бегом
Появляются время от времени такие разовые задачи
5 окт 17, 15:24    [20845681]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 43618
Uridian
andreymx
как наиболее быстро залить данные из Delphi 7 (датасет, массив) в таблицу MS SQL? Скажем, 100-300 тыс строк
Данные именно из Делфи, в другом месте их нет

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

спасибо
если в отпуске будет время, пороюсь
5 окт 17, 15:35    [20845723]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
MKZM
Member

Откуда:
Сообщений: 5140
А в чем проблема?
5 окт 17, 17:05    [20846044]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 43618
MKZM
А в чем проблема?
уточни вопрос, плз
5 окт 17, 21:13    [20846515]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 43618
andreymx
Uridian
пропущено...

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

спасибо
если в отпуске будет время, пороюсь
положу сюда еще ссылку
https://gist.github.com/tondrej/bc12fdf82ad04d6738df8c2d50459231
5 окт 17, 21:55    [20846590]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 43618
Потихоньку разбираюсь с примером https://gist.github.com/tondrej/bc12fdf82ad04d6738df8c2d50459231
переписываю на делфи 7
Не все данные выгружаются, а только те, которые прописаны разрабом явно
    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 сделал так, данные вроде выгружаются без ошибок:
      ftFloat:
        PDouble(@Column.Data[0])^ := Field.AsFloat;

что делать со стрингами, вообще не представляю, знаний не хватает.
Пробовал так, но в БД садится всякая хрень
      ftString, ftMemo:
        begin
          Column^.Length := StrLen(PAnsiChar(field.AsString));
          PPAnsiChar(@Column.Data[0])^ := PAnsiChar(field.AsString);
        end;
в таблице делал поля и varchar, и nvarchar
24 окт 17, 17:25    [20896366]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
vavan
Member

Откуда: Казань
Сообщений: 2908
andreymx
в Оракл из Экселя 300 тыс строк - аж бегом
а чем уж вставляешь если не секрет? я файрдаком батч (правда не такой жирный) пуляю и если ошибок нет то весьма шустро
25 окт 17, 11:14    [20897931]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 43618
Здесь ещё неплохой пример, на итальянском правда
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
5 ноя 17, 15:22    [20928552]     Ответить | Цитировать Сообщить модератору
 Re: как наиболее быстро залить данные из Delphi 7 (датасет, массив) в MS SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 43618
вроде получилось, тестирую
выгрузка 100 тыс строк идёт около 40 сек, что вполне нормально для моих целей
проверял на типах данных
    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);
осталось разобраться с порядками полей запросе и таблице, т.к. привязка идёт не по имени, а, похоже, как раз по порядку полей в таблице
5 ноя 17, 16:17    [20928605]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
Все форумы / Delphi Ответить