Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Загрузка DBF: openrowset или DTS  [new]
Stok
Member

Откуда:
Сообщений: 44
Нужно ежедневно грузить в базу (одну таблицу) несколько увесистых DBF-файлов (Мег под 50, записей до 700000 в каждом) с разными именами и из разных направлений.
Сделал хранимку, включающую фрагмент
-- Расписывается опенровсет
Set @bcpString1 = 'insert into Temp_ew 
(Phone_a , Phone_B , Duration,begintalk,tgname, tgout, prcall, AMAFile, Log_id )
Select Phone_a ,Phone_B , Duration, DateAdd(day, -2, Convert(datetime,begintalk)),
tgname, tgout, prcall, '''+ @AMAFile + ''',' + Convert(VarChar(20),@id)+ ' From '

Set @bcpString = 'openrowset(''MSDASQL'',
''Driver={Microsoft Visual FoxPro Driver}; SourceType=DBF;
Exclusive=No;Null=Yes;Deleted=Yes;SourceDB=' 
Set @bcpString = @bcpString + @PathDbfFile
Set @bcpString = @bcpString + ''',''select * from '
Set @bcpString = @bcpString + @NameDbfFile+''') where duration>0 '
Set @bcpString = @bcpString +
'and (Len(Phone_b)>6  or tgname in (''BMEFON'',''BVCOM'',''BMTS'') Or PrCall in (3,4)) '

Exec (@bcpString1+@bcpString)

Работает на ура, но ... загрузив несколько файлов, вылетает милое сообщение
There is insufficient system memory to run this query.
после чего 2000-й сервак вешается напрочь и помогает только перезагрузка. Естественно, это не радует пару десятков других пользователей.
Так что, люди, будте бдительны.

Придется, видимо, делать DTS. Сделал пока пакет без параметров ( @PathDbfFile, @NameDbfFile и др).
А как бы заменить в хранимке приведенный выше фрагмент на аналогичный фрагмент запуска DTS с параметрами?
Приведите примерчик, плиз, а то совсем некогда в доке рыться.
Прозит.

З.Ы. БалкКопи вязать не хочется, т.к. в саму базу грузится процентов тридцать от исходного ДБФа
8 окт 09, 14:16    [7758803]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка DBF: openrowset или DTS  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
А пакет у вас какого вида? Вы свой код в хранимую процедуру просто скопировали и дергаете её в пакете?
8 окт 09, 14:23    [7758848]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка DBF: openrowset или DTS  [new]
Stok
Member

Откуда:
Сообщений: 44
Да ну, это просто тест. Какие у него свойства.
С каталогом соединяюсь через ODBC, источник - SQL-запрос к одному из DBF-файлов этого каталога. Приемник один и тот же - таблица на сервере.
Хочется этот DTS переделать - добавить пару параметров (в частности, имя DBF-файла, из которого From), превратить во фрагмент скрипта и засунуть в тело моей хранимой процедуры.
Таковое можно?
Мой опыт здесь ограничивается созданием стационарного джоба на основе DTSа без параметров (Schedule Package).
Я и прошу совета у гуру по ДТСам
8 окт 09, 15:03    [7759153]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка DBF: openrowset или DTS  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Stok
Таковое можно?
Можно то - можно...
Но вот только вряд ли вам это поможет с вашим "There is insufficient system memory to run this query."
Начните лучше с публикации здесь результатов запроса select @@version.
8 окт 09, 15:07    [7759187]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка DBF: openrowset или DTS  [new]
Glory
Member

Откуда:
Сообщений: 104751
А чем вызвано использование динамики ? Имена, расположение и количество DBF-файлов все время меняется ?
8 окт 09, 15:12    [7759235]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка DBF: openrowset или DTS  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
Если будете делать через SSIS могу сразу прислать пакет, делающий эту задачу.
С DTS к сожалению не работал. Молод я еще )))
8 окт 09, 16:57    [7760317]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка DBF: openrowset или DTS  [new]
Stok
Member

Откуда:
Сообщений: 44
1.To tpg
select @@version
Microsoft SQL Server  2000 - 8.00.818 (Intel X86)   
May 31 2003 16:08:15   Copyright (c) 1988-2003 
Microsoft Corporation  Enterprise Edition 
on Windows NT 5.2 (Build 3790: Service Pack 2) 
---
Я (может наивно) полагаю, что OpenRowSet как объект, помещаемый в оперативную память, обрабатывая большие наботы, активно буферит ее (выжирает)
И, не исключаю, что "забывает" корректно ее освобождать.
Может DTS - более "отлизанная" фича и таких фокусов не допускает.

2.To Glory
Специфика задачи - нужно ежедневно с разных АТС закачать файлы со списком телефонных соединений. Имя файла на каждый день уникально - 20090901.dbf и т.д. Но нужно еще тащить идентификатор АТС. У нас чудесно работала эта же процедура с использованием bulkCopy, но мне приспичило поэкспериментировать.

3.To --__Александр__--
Буду признателен любым посылкам с примерами и советами. Если не получится, то кругозор расширится.
Шлите на stok1@list.ru
8 окт 09, 17:30    [7760601]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка DBF: openrowset или DTS  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
Может кому пригодится, поэтому выложу сюда пример.

Контейнер в цикле считывает в переменную @PATH пути к различным dbf файлам и загружает данные из файлов, лежащих по этим путям.

1.Первые два таска считывают путь в переменную.
2.В дата флоу таске в Источнике Data access mode выбираем SQL command from variable.
3.Создаем переменную SQL_Code(типа стринг), в свойстве Evaluateasexpression пишем True
4.В переменной собираем код. У меня вот какой:
"
SELECT * FROM OPENROWSET
('VFPOLEDB',
'"+ @[User::PATH] + "'
;'';'',
'select * from Vznos')
"

Так же в качестве переменной могут быть и имена таблиц.
Можно поиграться с BufferTempStoragePath и DefaultBufferSize.

Выслать постараюсь вечерком.

К сообщению приложен файл. Размер - 0Kb
8 окт 09, 17:52    [7760770]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка DBF: openrowset или DTS  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Stok
1.To tpg
select @@version
Microsoft SQL Server  2000 - 8.00.818 (Intel X86)   
May 31 2003 16:08:15   Copyright (c) 1988-2003 
Microsoft Corporation  Enterprise Edition 
on Windows NT 5.2 (Build 3790: Service Pack 2) 
---
Я (может наивно) полагаю, что OpenRowSet как объект, помещаемый в оперативную память, обрабатывая большие наботы, активно буферит ее (выжирает)
И, не исключаю, что "забывает" корректно ее освобождать.
Может DTS - более "отлизанная" фича и таких фокусов не допускает.
Разницы никакой не будет - вы используете одну и ту же технологию, только с разных клиентов. Если поменять, то может что-то и получится - в DTS кроме динамически формируемого OpenRowSet-а достаточно и своих механизмов.
К тому же, вдруг у вас действительно мало памяти...
Третий сервиспак - патч конечно весьма стабильный, но, всё же, попробуйте установить сп4 с последним доступным коммулятивным апдейтом - http://sqlserverbuilds.blogspot.com/ (билда 2187 вполне достаточно).
9 окт 09, 06:23    [7762144]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Загрузка DBF: openrowset или DTS  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
--__Александр__--
Может кому пригодится, поэтому выложу сюда пример.

Контейнер в цикле считывает в переменную @PATH пути к различным dbf файлам и загружает данные из файлов, лежащих по этим путям.

1.Первые два таска считывают путь в переменную.
2.В дата флоу таске в Источнике Data access mode выбираем SQL command from variable.
3.Создаем переменную SQL_Code(типа стринг), в свойстве Evaluateasexpression пишем True
4.В переменной собираем код. У меня вот какой:
"
SELECT * FROM OPENROWSET
('VFPOLEDB',
'"+ @[User::PATH] + "'
;'';'',
'select * from Vznos')
"

Так же в качестве переменной могут быть и имена таблиц.
Можно поиграться с BufferTempStoragePath и DefaultBufferSize.

Выслать постараюсь вечерком.


Можно подробней как считать путь в переменную через таск?
9 ноя 11, 16:52    [11571036]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка DBF: openrowset или DTS  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
andrew shalaev,

Может кто подскажет?
10 ноя 11, 11:27    [11573272]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить