Страница 1 из 1

MS SQL -> .CSV file как?

Добавлено: 23 Декабрь 2005, 12:02
Caня
Уважаемые,
Как в С6.1 (Legacy) реализовать экспорт данных из MS SQL в простой текстовый ASCII фал с разделением данных Tab-ом? SQL запрос всегда разный, соответсвенно выдает разное количество полей и записией.

Можно ответить в начале только суть.
А если не разберусь то потом и детали спрошу.

С уважением.

Добавлено: 23 Декабрь 2005, 13:54
ru_alex
Объявляешь ASCII файл, а строку формируешь с Tab:

"знач. поля1" & '<9>' & "знач. поля2" и тд.

Зы: На память tab это 9, но могу ошибаться.
Зы2: Не забудь про заголовок, если нужен.

Добавлено: 23 Декабрь 2005, 13:58
ru_alex
В догонку...
В MSSQL есть модуль импорта/экспорта данных, в нем CSV точно есть.
Я сам не пробовал, но наверняка можно командами SQL такой экспорт сделать.

Добавлено: 23 Декабрь 2005, 14:25
Ravenous
посмотри в Book Online OpenDataSource, OpenRowSet,
правда раз кол-во столбцов каждый раз разное
нужно для каждого нового файла свою схему (schema.ini) прописывать.

Добавлено: 23 Декабрь 2005, 15:53
Caня
Спасибо за ответы.
Вроде сам допер.
Вот как я сделал, если кому интерестно:
В Declaration Section объявил 2 файла, один для записи результатов на локальном диске, другой для формирования SQL запроса.

Код: Выделить всё

CSVFile          FILE,DRIVER('ASCII'),NAME(FilePath),PRE(CSV),CREATE,THREAD
Record             RECORD,PRE()
Desc                 STRING(8000)
                   END
                 END

SQLFile         FILE,DRIVER('MSSQL'),OWNER('(local),IX'),NAME('dbo.SQLFile'),PRE(SQL),BINDABLE,CREATE
Record            RECORD,PRE()
DSCR                STRING(8000)
                  END
                END
Ну и в Embeds After Code Generated для кнопки (Accepted)

Код: Выделить всё

s# = FILEDIALOG('Select File', FilePath, 'CSV|*.TXT',1)
SETPATH(FilePath)
DLMTR='<09>'
CREATE(CSVFile)
OPEN(CSVFile)
CREATE(SQLFile)
OPEN(SQLFile)
SQLstring='select convert(varchar,i.name)+'''&DLMTR&'''+convert(varchar,c.name) as text from ITMS i, CUSTS c where i.cust=c.id'
CSV:Record='HEADER'&DLMTR&'QUERY:'&SQLstring
ADD(CSVFile)
SQLFile{PROP:SQL} = CLIP(SQLstring)
LOOP
NEXT(SQLFile)
if errorcode() then break.
    SQLreply=SQL:Record
    CSV:Record=SQL:Record
    ADD(CSVFile)
.
CLOSE(SQLFile)
CLOSE(CSVFile)
DISPLAY
Это только работающая модель. С нее можно вылепить нужный код.
Есть ограничение 8000 знаков на запись, но в большинстве случаев этого хватит. А кому не хватит, можно подправить. ;)

С уважением.