SQL вопрос

uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

SQL вопрос

Post by uniqueman »

Есть серверное приложение , которое обрабатывает приходящие данные и вставляет записи в базу.

Данные приходят в простом текстовом виде, разделенные разделителями..

data 1 # data 2 # data 3... и так далее

вообщем суть такая, что когда сервер парсит data, то после этого сразу же делает INSERT на эти данные. Потом парсит другую data и опять INSERT.

Можно ли как нибудь сделать чтобы он отпарсил все, а потом сделал какой нибудь BATCH INSERT. ? Пока данных приходит немного и это огромной роли не делает, но сам факт вызова INSERT много раз немного не нравится мне.

Сервер - SQL Server 2000. Для работы с базой использую C OLE DB интерфейс
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Re: SQL вопрос

Post by tengiz »

See BCP / BULK INSERT or BCP API / IRowsetFastLoad interface.
Cheers
uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

Post by uniqueman »

Тенгиз, пардон наврал. Я использую DB Library for C интерфейс.

Не подкините примерчик BULK INSERT для след. таблицы

HouseID HouseName Sum
------------------------------------------------------
121 Morgan 20
125 ChiCorp 30
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

См. MSDN Online - DBLib bcp functions - bcp_bind example.

Но вообще-то лучше пользоваться ODBC (bcp API) или OLEDB (IRowsetFastLoad), так как DBLIB API существует только для обратной совместимости и не поддерживает никаких новшеств начиная с SQL Server 7.0.
Cheers
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

Для bulk insert statement импортируемые данные должны быть сохранены в файле. При условии, что поля в исходном файле разделены символом '#', как в Вашем первом сообщении, дальше просто делается следующее:

BULK INSERT targetTable FROM 'dataFileName' WITH (FIELDTERMINATOR='#', ROWTERMINATOR='\r\n')
Cheers

Return to “Вопросы и новости IT”