Текстовые файл *.txt -> SQL Server
DM.PROFF
Дата: 04.12.2002 13:26:01
Система сбора статистики каждый час формирует выходной текстовый файл. Первая строка - наименование столбцов, последующие строки - данные. Причём, КОЛИЧЕСТВО СТОЛБЦОВ может время от времени изменяться. Поэтому создавать заранее таблицу, в которую будут копироваться данные, не имеет смысла, потому что такие фичи как BCP, BULK INSERT и т.д. переносят данные в существующую таблицу. Задача: необходимо каким-то образом автоматически создать таблицу и скопировать в неё данные.
СергейК
Дата: 04.12.2002 13:50:29
Используй DTS, например, в Enterprise Manager. Именно для таких случаев это и предназначено
vap
Дата: 04.12.2002 14:27:11
BULK INSERT - решает вашу задачу.
if NOT(object_id('TempDb..#temp') IS NULL) DROP TABLE #temp
CREATE TABLE #temp (line varchar(4000))
BULK INSERT #temp FROM 'c:\boot.ini'
select * from #temp |
|
DM.PROFF
Дата: 04.12.2002 14:45:10
To vap.
Дело в том, что в таблице #temp я получаю построчную копию файла, а мне надо создать таблицу с неизвестным заранее количеством полей, в которой имена полей находятся в первой строке файла (поля разделены символом табуляции).
vap
Дата: 04.12.2002 14:54:54
В любом случае ваш парсер дожен знать структуру, или генерите файлы в формате XML.
Можно строки пропарсить по разделителям.
SQL сервер достаточно быстро работает со строками.
У меня получалось закачивать со скоростью около 1000 строк/сек.
dkstranger
Дата: 04.12.2002 15:26:04
Я подобные вещи решаю динамическим запросом
типа
declare @sss varchar(500)
if @object_id(@tbl) is null begin
select @sss='create table '+LTRIM(RTRIM(@tbl))+'( id int'
select @sss=LTRIM(RTRIM(@sss))+', ff moey '
--- далее сервер формирует определение таблицы
select @sss=LTRIM(RTRIM(@sss))+') '
exec(@sss)
end
Glory
Дата: 06.12.2002 17:24:42
Если у вас действительно выполняются следующие условия
"формирует выходной текстовый файл. Первая строка - наименование столбцов, последующие строки - данные" плюс поля разделены стандартным delimiter-ом, то я бы предложил использовать linked server хоть бы с Jet.OLEDB Provider. Тогда можно делать выборки вида
SELECT * FROM mylinkedtxtsrv...myfile#txt
Единственная "особенность" в том, что Jet.OLEDB Provider может неправильно определять типы данных в столбцах, т.к. делает это сканируя N первых строк файла. Но эту проблему можно обойти создав файл schema.ini
Maxx
Дата: 06.12.2002 17:48:15
DTS ?