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

Откуда:
Сообщений: 31
Здравствуйте!

Перечитал все темы на форуме по поводу импорта txt-файлов в таблицы SQL Server и остановился на BULK INSERT, написал маленький скриптик для импорта, взяв за основу пример в одной из тем (txt-файл с данными для импорта и sql-файл со скриптом находятся в приложении к теме). Вроде бы сам процесс импорта происходит без проблем, но меня не устраивает конечная сформированная таблица, которая имеет всего одно поле varchar(max), которое принимает на себя всю строку. Мне бы хотелось разбить её по полям так, что по разделителю табуляции импорт отрабатывал соответственно, но при изменении структуры временной таблицы-приёмника постоянно происходят ошибки то неправильной конвертации, то неожиданного конца файла и т.п.
Если кто-нибудь может помочь в решении данной проблемы, то прошу вас просмотреть приложенный архивчик и указать мне, что именно я делаю не так. Примечание: по умолчанию путь к txt-файлу оставил как есть у меня в рабочем состоянии.

Заранее спасибо...

К сообщению приложен файл (файлики.rar - 6Kb) cкачать
18 дек 09, 16:02    [8087842]     Ответить | Цитировать Сообщить модератору
 Re: Проблема txt2sql  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
BULK INSERT #qwerty
FROM 'D:\sqlru\1.txt' 
WITH (DATAFILETYPE = 'widechar', 
FIELDTERMINATOR = '\t',
ROWTERMINATOR = '\n'
)
-------------------------------------
Jedem Das Seine
18 дек 09, 16:36    [8088126]     Ответить | Цитировать Сообщить модератору
 Re: Проблема txt2sql  [new]
Lost_Stranger
Member

Откуда:
Сообщений: 31
Maxx
BULK INSERT #qwerty
FROM 'D:\sqlru\1.txt' 
WITH (DATAFILETYPE = 'widechar', 
FIELDTERMINATOR = '\t',
ROWTERMINATOR = '\n'
)
-------------------------------------
Jedem Das Seine


нет, такой вариант не устраивает, поскольку структура конечной таблицы-приёмника не изменилась. Данные в вашем варианте просто помещаются в одну строку одного поля.
01.12.2009 00:00 - 00:30 0,768 0 0,3648 0 ......

Это ещё хуже, чем в первоначальном варианте.
01.12.2009 00:00 - 00:30 0,768 0 0,3648 0
00:30 - 01:00 0,7056 0 0,3384 0
...


Мне требуется разбить строки на поля по имеющимся в данных символам табуляции, а для этого надо временную таблицу-приёмник #qwerty создать так, чтобы она принимала в себя значения полей из импорта BULK INSERT
18 дек 09, 16:48    [8088245]     Ответить | Цитировать Сообщить модератору
 Re: Проблема txt2sql  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
create table #qwerty(col1 nvarchar(max),
				    col2 nvarchar(max),
					col3 nvarchar(max),
					col4 nvarchar(max),
					col5 nvarchar(max),
					col6 nvarchar(max),
					col7 nvarchar(max))

BULK INSERT #qwerty
FROM 'D:\sqlru\1.txt' 
WITH (DATAFILETYPE = 'widechar', 
FIELDTERMINATOR = '\t',
ROWTERMINATOR = '\n'
)

я дела вот так ,вроде как хі в свое мпримере хотели ?
-------------------------------------
Jedem Das Seine
18 дек 09, 16:53    [8088284]     Ответить | Цитировать Сообщить модератору
 Re: Проблема txt2sql  [new]
O_val
Member

Откуда:
Сообщений: 157
Lost_Stranger
поскольку структура конечной таблицы-приёмника не изменилась


ну так измените структуру
18 дек 09, 16:53    [8088285]     Ответить | Цитировать Сообщить модератору
 Re: Проблема txt2sql  [new]
Lost_Stranger
Member

Откуда:
Сообщений: 31
Maxx
create table #qwerty(col1 nvarchar(max),
				    col2 nvarchar(max),
					col3 nvarchar(max),
					col4 nvarchar(max),
					col5 nvarchar(max),
					col6 nvarchar(max),
					col7 nvarchar(max))

BULK INSERT #qwerty
FROM 'D:\sqlru\1.txt' 
WITH (DATAFILETYPE = 'widechar', 
FIELDTERMINATOR = '\t',
ROWTERMINATOR = '\n'
)

я дела вот так ,вроде как хі в свое мпримере хотели ?
-------------------------------------
Jedem Das Seine


вы посмотрите на получившуюся таблицу... в col7 поместилось всё, что должно было уйти на вторую и далее строки.. так, например, если таблицу создать так:

create table #qwerty(col1 nvarchar(max),
col2 nvarchar(max),
col3 nvarchar(max),
col4 nvarchar(max),
col5 nvarchar(max),
col6 nvarchar(max),
col7 nvarchar(max),
col8 nvarchar(max),
col9 nvarchar(max)
)


то можно увидеть, что содержимое col8 должно соответствует по типу col2 и должно поместиться именнь в col2... здесь надо уточнить, что требуемы разделитель строк строго /r
Попробуйте 1.txt открыть в Excel... именно так должна выглядеть в результате таблица-приёмник
18 дек 09, 17:05    [8088402]     Ответить | Цитировать Сообщить модератору
 Re: Проблема txt2sql  [new]
Glory
Member

Откуда:
Сообщений: 104760
Lost_Stranger


то можно увидеть, что содержимое col8 должно соответствует по типу col2 и должно поместиться именнь в col2... здесь надо уточнить, что требуемы разделитель строк строго /r
Попробуйте 1.txt открыть в Excel... именно так должна выглядеть в результате таблица-приёмник

И какой у вас разделитель строк в файле? Именно какой разделитель, а не то, как вам этот разделитель отображает тот же Excel
18 дек 09, 17:07    [8088417]     Ответить | Цитировать Сообщить модератору
 Re: Проблема txt2sql  [new]
Lost_Stranger
Member

Откуда:
Сообщений: 31
O_val
Lost_Stranger
поскольку структура конечной таблицы-приёмника не изменилась


ну так измените структуру


в том то и дело, что при изменении структуры таблицы в :

create table #qwerty(col1 nvarchar(max),
col2 nvarchar(max),
col3 nvarchar(max),
col4 nvarchar(max),
col5 nvarchar(max),
col6 nvarchar(max),
col7 nvarchar(max))

BULK INSERT #qwerty
FROM '\\10.169.0.2\sb\current\1.txt'
WITH ( CODEPAGE = 'ACP',
DATAFILETYPE = 'char',
FIELDTERMINATOR = '\t',
FIRSTROW = 6,
ROWTERMINATOR = '\r',
KEEPNULLS
)
select * from #qwerty
drop table #qwerty

возникают ошибки:

Msg 4832, Level 16, State 1, Line 16
Bulk load: An unexpected end of file was encountered in the data file.
Msg 7399, Level 16, State 1, Line 16
The OLE DB provider "BULK" for linked server "(null)" reported an error. The provider did not give any information about the error.
Msg 7330, Level 16, State 2, Line 16
Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".
18 дек 09, 17:08    [8088419]     Ответить | Цитировать Сообщить модератору
 Re: Проблема txt2sql  [new]
Lost_Stranger
Member

Откуда:
Сообщений: 31
Glory
Lost_Stranger


то можно увидеть, что содержимое col8 должно соответствует по типу col2 и должно поместиться именнь в col2... здесь надо уточнить, что требуемы разделитель строк строго /r
Попробуйте 1.txt открыть в Excel... именно так должна выглядеть в результате таблица-приёмник

И какой у вас разделитель строк в файле? Именно какой разделитель, а не то, как вам этот разделитель отображает тот же Excel


Просматривая 1.txt в Notepad++, я вижу, что разделители полей - символ табуляции, а разделитель строк - перевод каретки
18 дек 09, 17:10    [8088443]     Ответить | Цитировать Сообщить модератору
 Re: Проблема txt2sql  [new]
Glory
Member

Откуда:
Сообщений: 104760
Lost_Stranger
Glory
Lost_Stranger


то можно увидеть, что содержимое col8 должно соответствует по типу col2 и должно поместиться именнь в col2... здесь надо уточнить, что требуемы разделитель строк строго /r
Попробуйте 1.txt открыть в Excel... именно так должна выглядеть в результате таблица-приёмник

И какой у вас разделитель строк в файле? Именно какой разделитель, а не то, как вам этот разделитель отображает тот же Excel


Просматривая 1.txt в Notepad++, я вижу, что разделители полей - символ табуляции, а разделитель строк - перевод каретки

Нет такого символа "перевода каретки" есть "перевод строки" и "возврат каретки"
18 дек 09, 17:15    [8088475]     Ответить | Цитировать Сообщить модератору
 Re: Проблема txt2sql  [new]
Lost_Stranger
Member

Откуда:
Сообщений: 31
Glory
Lost_Stranger
Glory
Lost_Stranger


то можно увидеть, что содержимое col8 должно соответствует по типу col2 и должно поместиться именнь в col2... здесь надо уточнить, что требуемы разделитель строк строго /r
Попробуйте 1.txt открыть в Excel... именно так должна выглядеть в результате таблица-приёмник

И какой у вас разделитель строк в файле? Именно какой разделитель, а не то, как вам этот разделитель отображает тот же Excel


Просматривая 1.txt в Notepad++, я вижу, что разделители полей - символ табуляции, а разделитель строк - перевод каретки

Нет такого символа "перевода каретки" есть "перевод строки" и "возврат каретки"


Notepad++ отображает, что в конце строки стоит символ "CR".... это соответствует, если я не ошибаюсь, ROWTERMINATOR = '\r'
18 дек 09, 17:17    [8088494]     Ответить | Цитировать Сообщить модератору
 Проблема txt2sql  [new]
Lost_Stranger
Member

Откуда:
Сообщений: 31
Вобщем немного разобрался с возникавшими ошибками... Файл 1.txt был сформирован сторонним приложением, и, как и говорил мне в ошибке SQLSERVER, имел "неожиданный конец файла". После ручного редактирования 1.txt скрипт в таком виде:

create table #qwerty(col1 nvarchar(max),
col2 nvarchar(max),
col3 nvarchar(max),
col4 nvarchar(max),
col5 nvarchar(max),
col6 nvarchar(max),
col7 nvarchar(max))
BULK INSERT #qwerty
FROM '\\10.169.0.2\sb\current\1.txt'
WITH ( CODEPAGE = 'ACP',
DATAFILETYPE = 'char',
FIELDTERMINATOR = '\t',
FIRSTROW = 6,
ROWTERMINATOR = '\r',
KEEPNULLS
)
select * from #qwerty
drop table #qwerty


отработал именно так как нужно и выдал информацию в требуемой форме... Но всвязи с этим родился другой вопрос - т.к. файлов подобных 1.txt сотни и вручную их обработать, удаляя этот "неожиданный конец файла", не является корректным, то собственно сам новый вопрос: как заставить SQLSERVER обходить возможную такую ошибку и продолжать работу, не взирая на неё?
18 дек 09, 17:42    [8088641]     Ответить | Цитировать Сообщить модератору
 Re: Проблема txt2sql  [new]
Glory
Member

Откуда:
Сообщений: 104760
Lost_Stranger


отработал именно так как нужно и выдал информацию в требуемой форме... Но всвязи с этим родился другой вопрос - т.к. файлов подобных 1.txt сотни и вручную их обработать, удаляя этот "неожиданный конец файла", не является корректным, то собственно сам новый вопрос: как заставить SQLSERVER обходить возможную такую ошибку и продолжать работу, не взирая на неё?

И как вы предлагаете обходить неправильный формат файла ? Сервер сам должен додумать, где кончаются неправильные данные и где начинаются правильные ?
18 дек 09, 17:47    [8088667]     Ответить | Цитировать Сообщить модератору
 Re: Проблема txt2sql  [new]
Lost_Stranger
Member

Откуда:
Сообщений: 31
Glory
Lost_Stranger


отработал именно так как нужно и выдал информацию в требуемой форме... Но всвязи с этим родился другой вопрос - т.к. файлов подобных 1.txt сотни и вручную их обработать, удаляя этот "неожиданный конец файла", не является корректным, то собственно сам новый вопрос: как заставить SQLSERVER обходить возможную такую ошибку и продолжать работу, не взирая на неё?

И как вы предлагаете обходить неправильный формат файла ? Сервер сам должен додумать, где кончаются неправильные данные и где начинаются правильные ?


я не знаю все возможности SQLSERVER, и всего лишь предполагаю возможность контроля над получаемыми исключениями через установку соответствующих параметров и использованием try/catch... хотя я ни разу под SQLSERVER подобного не делал, но думаю, что "копать" надо в ту сторону...
18 дек 09, 17:54    [8088699]     Ответить | Цитировать Сообщить модератору
 Re: Проблема txt2sql  [new]
Glory
Member

Откуда:
Сообщений: 104760
Lost_Stranger


я не знаю все возможности SQLSERVER, и всего лишь предполагаю возможность контроля над получаемыми исключениями через установку соответствующих параметров и использованием try/catch... хотя я ни разу под SQLSERVER подобного не делал, но думаю, что "копать" надо в ту сторону...

BULK INSERT - это одна команда.
Хотите обрабатывать каждую строку входного файла отдельно - пишите цикл для обработки каждой строки.
18 дек 09, 17:56    [8088710]     Ответить | Цитировать Сообщить модератору
 Re: Проблема txt2sql  [new]
Lost_Stranger
Member

Откуда:
Сообщений: 31
Glory

BULK INSERT - это одна команда.
Хотите обрабатывать каждую строку входного файла отдельно - пишите цикл для обработки каждой строки.


в принципе с самого начала у меня была похожая мысль для чтения построчно по FileStream из отдельного приложения, но посчитал, что SqlServer сможет справиться с этим более корректно... видимо, действительно придётся писать подобную хранимую процедуру... Вы очень съэкономили бы мне время, если у Вас под рукой имеется пример подобного цикла перебора строк внешнего файла на T-Sql...
18 дек 09, 18:03    [8088753]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить