2009-10-29 5 views
1

У меня возникли проблемы с массой вставки файла, содержащего поле в тексте типа данных, и оно содержит вхождения, а разделитель для полей - это трубы »| " и терминатор строки «| \ n»Массовая вставка файла с текстовым полем с возвратом каретки (входит)

У меня получается ошибка усечения полей рядом с текстовым полем. Я думаю, что основная вставка думает, что входящие во второе поле следующие строки.

DECLARE @sql varchar(2000) 
PRINT 'xyz table' 
SET @sql = 
'BULK INSERT xyz 
    FROM ''\\' + @@servername + '\Import\xyz.txt'' 
    WITH 
     (
       DATAFILETYPE = ''char'', 
       FIELDTERMINATOR   = ''|'', 
       ROWTERMINATOR   = ''|\n'', 
       TABLOCK, 
       ROWS_PER_BATCH   = 2000, 
       MAXERRORS  = 1000 

       ) 
' 
PRINT @sql 
EXECUTE (@sql) 
PRINT '' 
GO 

Это пример данных

467507**|**08-20-09\ 
[8:55:03 AM] *** [email protected] is Not Available [Ext. away]\(CR) 
[9:00:57 AM] *** [email protected] is Online [Online]\(CR) 
[9:01:00 AM] <jeffp> Howdy. Time slip update game! Update TS#467493 & 467507 with a (CR)comment and see if you win! [9:01:30 AM] *** [email protected] is Away [Away]\ 
\(CR) 
08-18-09\(CR) 
[10:13:15 AM] *** [email protected] is Online [Online]\(CR) 
[10:13:59 AM] <jeffp> Howdy; welcome back from lunch.. Just pinging you for an update in TS#467493 & 467507. Since 467493 is pri9, want a stock e-mail to go out to the customer to get them moving?\(CR) 
[10:14:47 AM] <[email protected]> thats ok i got it\(CR) 
[10:14:53 AM] <jeffp> Aiight.**|**2009-08-18 00:00:00**|**2009-08-20 00:00:00**|**JDP**|**JDP**|** 

Схема таблицы:

create table xyz 
    (
    xyz_id VARCHAR(200), --INT TO VARCHAR 
    notes text, 
    create_date varchar(32), --DATETIME 
    create_user varchar(12), 
    modify_date varchar(32), --DATETIME 
    modify_user varchar(12) 
) 

Как вы можете видеть (ну, не может видеть) там входит (отмеченные CR) и объемная вставка смешивает их с новой строкой.

Любая помощь будет оценена по достоинству.

Thanks

+0

Как вы знаете, когда строка действительно заканчивается? –

+0

Вы уверены, что ограничитель строк \ n, не \ r или \ r \ n? –

+0

конец строки «| \ n», просто второй второй JDP –

ответ

1

EDIT: вы не нужен формат файла:

IF OBJECT_ID('tempdb..#rawdata') IS NOT NULL DROP TABLE #rawdata 
create table #rawdata (
    xyz_id VARCHAR(200) 
, notes text 
, create_date varchar(32) 
, modify_date varchar(32) 
, create_user varchar(12) 
, modify_user varchar(12) 
) 

BULK INSERT #rawdata 
FROM 'C:\temp\file.txt' 
WITH (
    FIELDTERMINATOR = '**|**' 
    , ROWTERMINATOR = '**|**\n' 
    , TABLOCK 
) 

SELECT * FROM #rawdata 

Вам может понадобиться, чтобы играть с **|**\n (LF) против **|**\r\n (CRLF) против **|**\r (CR), в зависимости от того файла это Unix, DOS или MAC-like.

/EDIT

Это не может быть сделано без файла формата. Таким образом, создать файл формата:

8.0 
7 
1 SQLCHAR 0 0 "**|**" 1 xyz_id  "" 
2 SQLCHAR 0 0 "**|**" 2 notes   "" 
3 SQLCHAR 0 0 "**|**" 3 create_date "" 
4 SQLCHAR 0 0 "**|**" 4 modify_date "" 
5 SQLCHAR 0 0 "**|**" 5 create_user "" 
6 SQLCHAR 0 0 "**|**" 6 modify_user "" 
7 SQLCHAR 0 0 "\n" 0 omitted  "" 

Тогда:

IF OBJECT_ID('tempdb..#rawdata') IS NOT NULL DROP TABLE #rawdata 
create table #rawdata (
    xyz_id VARCHAR(200) 
, notes text 
, create_date varchar(32) 
, modify_date varchar(32) 
, create_user varchar(12) 
, modify_user varchar(12) 
) 

BULK INSERT #rawdata 
FROM '\\folder\file.txt' 
WITH (
    FORMATFILE = '\\folder\file.fmt' 
    , TABLOCK 
) 

Или в SQL 2005+:

SELECT * FROM OPENROWSET(
    BULK '\\folder\file.txt' 
    , FORMATFILE = '\\folder\file.fmt' 
) a 
+0

Спасибо, Питер!, Я попробую сразу. вы, например, более полны и точны, чем документация, которую я рассмотрел. –

+0

Вот моя обычная ссылка: http://msdn.microsoft.com/en-us/library/ms191479.aspx –

+0

Питер, я попробовал решение, но получаю ту же ошибку. Я изменил «\ n» на «| \ n» в файле формата. Я получаю эту ошибку: Сервер: Msg 4866, уровень 17, состояние 66, строка 1 Массовая вставка не удалась. Столбец слишком длинный в файле данных для строки 1, столбец 1. Убедитесь, что терминатор поля и ограничитель строк указаны правильно. Сервер: Msg 7399, уровень 16, состояние 1, строка 1 Поставщик OLE DB «STREAM» сообщил об ошибке. Поставщик не предоставил никакой информации об ошибке. Ошибка протокола OLE DB [OLE/DB Provider «STREAM» IRowset :: GetNextRows возвращен 0x80004005: –

1

Данные не соответствуют друг другу. У вас есть несколько строк, заканчивающихся \(cr) с одним полем, другое (cr) заканчивается | колонковые сепараторы

Либо это, либо у вас непоследовательные разделители колонн, некоторые \(cr), некоторые |. Если это так, вам понадобится format file, чтобы иметь дело с каждой отдельной колонкой.

Смежные вопросы