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

Откуда:
Сообщений: 1001
в конце файла нет символа перевода каретки

Пишу так:
bulk insert [dbo].[~CMP_UPLOAD02]

from 'c:\CMSDW.02file20121017000000.txt'

with (codepage ='acp',
fieldterminator = '|')

Последняя строка не загружается вообще!!! И ошибок никаких нет.
Если же поставить перевод строки, то все в порядке.
Почему? Первый раз такое вижу.
19 окт 12, 10:05    [13344658]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT не грузит последнюю строчку - как исправить?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Albatross
Если же поставить перевод строки, то все в порядке.
Почему?

А как по вашему сервер узнает, что строка закончилась, если нет признака окончания строки ?
19 окт 12, 10:09    [13344679]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT не грузит последнюю строчку - как исправить?  [new]
Albatross
Member

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

По концу файла!
19 окт 12, 10:10    [13344690]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT не грузит последнюю строчку - как исправить?  [new]
Albatross
Member

Откуда:
Сообщений: 1001
А если не смог понять что строка закончилась (это удивительно), так пусть напишет!! неожиданный конец файла и так далее.
Строчка не загружена и ошибок тоже нет.
19 окт 12, 10:11    [13344696]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT не грузит последнюю строчку - как исправить?  [new]
Glory
Member

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

По концу файла!

Что такое "конец файла" ? Каким символом он определяется ?
19 окт 12, 10:11    [13344697]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT не грузит последнюю строчку - как исправить?  [new]
Albatross
Member

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

Физически окончился файл.
Больше нечего читать с диска.
19 окт 12, 10:12    [13344703]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT не грузит последнюю строчку - как исправить?  [new]
Glory
Member

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

Физически окончился файл.
Больше нечего читать с диска.

Почему это должно быть тождественно окончанию строки ?
19 окт 12, 10:14    [13344717]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT не грузит последнюю строчку - как исправить?  [new]
Albatross
Member

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

Вы лучше скажите - это всегда было так?
У меня претензии две. Если он не понял, что строка кончилась уже, так как закончился файл, почему бы ему не ругнуться.
И вторая претензия - мне кажется очевидным, что конец файла по умолчанию должен распознаваться как конец строки.
19 окт 12, 10:17    [13344738]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT не грузит последнюю строчку - как исправить?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Albatross
Вы лучше скажите - это всегда было так?

Всегда

Albatross
Если он не понял, что строка кончилась уже, так как закончился файл, почему бы ему не ругнуться.

Строка для bulk insert заканчивается тогда, когда встречается заданный разделитель строк.

Albatross
И вторая претензия - мне кажется очевидным, что конец файла по умолчанию должен распознаваться как конец строки.

По какому стандарту ?
19 окт 12, 10:20    [13344758]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT не грузит последнюю строчку - как исправить?  [new]
Albatross
Member

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

"Строка для bulk insert заканчивается тогда, когда встречается заданный разделитель строк."
Ну допустим последняя строка так и не кончилась.
Почему же сервер не выдает никаких ошибок и строку тоже не грузит?
19 окт 12, 10:24    [13344792]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT не грузит последнюю строчку - как исправить?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Albatross
Почему же сервер не выдает никаких ошибок и строку тоже не грузит?

Может баг. Может фича.
Вы же как всегда не считаете нужным предоставить ни информацию о сервере, ни данных для воспрозведения ситуации.
19 окт 12, 10:39    [13344868]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT не грузит последнюю строчку - как исправить?  [new]
Albatross
Member

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

Да пожалуйста.
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)
Jun 17 2011 00:54:03
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 5.2 <X64> (Build 3790: Service Pack 2)


Вот таблица

CREATE TABLE [dbo].[~CMP_TRUP](
	[SOURCE] [varchar](50) NULL,
	[TYPE] [varchar](50) NULL,
	[TRX_ID] [bigint] NULL,
	[ACQ_ID] [varchar](15) NULL,
	[ACQ_BIN] [varchar](16) NULL,
	[ISS_ID] [varchar](15) NULL,
	[PAN] [varchar](10) NULL,
	[TIME_AUTH] [datetime] NULL,
	[TERM_ID] [varchar](15) NULL,
	[TRX_TYPE] [varchar](10) NULL,
	[RVSL_FLG] [bit] NULL,
	[ORI_AMOUNT] [bigint] NULL,
	[ORI_CCRNCY] [char](3) NULL,
	[AMOUNT] [bigint] NULL,
	[CCRNCY] [char](3) NULL,
	[PAY_SYS] [char](1) NULL,
	[PAY_SYST1] [char](10) NULL,
	[CRDTYPE] [char](1) NULL,
	[CPD] [datetime] NULL,
	[FEE1] [bigint] NULL,
	[FEE2] [bigint] NULL,
	[FEE3] [bigint] NULL,
	[MERCH_ID] [varchar](15) NULL,
	[DOC_ID] [bit] NULL,
	[RESP_CDE] [varchar](10) NULL,
	[FRAUD_LVL] [int] NULL,
	[CHBK_DATE] [datetime] NULL,
	[AUTH_CDE] [char](6) NULL,
	[SYS_ID] [char](1) NULL,
	[COND_CDE] [char](2) NULL,
	[ISS_FLG] [bit] NULL,
	[ACQ_FLG] [bit] NULL,
	[country_acq_code] [char](3) NULL,
	[country_iss_code] [char](3) NULL,
	[serial] [varchar](32) NULL,
	[sum_ps] [decimal](26, 4) NULL,
	[currency_ps] [char](3) NULL,
	[visa_product_type] [char](3) NULL,
	[csic] [char](4) NULL
) ON [PRIMARY]


Файл в приложении.
Вторая строка не грузится и не ругается:


truncate table  [dbo].[~CMP_TRUP]


bulk insert [dbo].[~CMP_TRUP]

from 'c:\CMSDW.02CPLUSINCTRAN20121017000000.txt'

with (codepage ='acp',
fieldterminator = '|',
maxerrors=0)

select * from  [dbo].[~CMP_TRUP]


К сообщению приложен файл (CMSDW.02CPLUSINCTRAN20121017000000.txt - 278bytes) cкачать
19 окт 12, 10:49    [13344966]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT не грузит последнюю строчку - как исправить?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Albatross
Вторая строка не грузится и не ругается:

так вы на вторую строку и не переходите
19 окт 12, 10:58    [13345029]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT не грузит последнюю строчку - как исправить?  [new]
Albatross
Member

Откуда:
Сообщений: 1001
Knyazev Alexey,

Почему? Колонок, насколько я смотрел, верное количество.
У первой строки перевод верный.
19 окт 12, 10:59    [13345038]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT не грузит последнюю строчку - как исправить?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Albatross
Glory,

"Строка для bulk insert заканчивается тогда, когда встречается заданный разделитель строк."
Ну допустим последняя строка так и не кончилась.
Почему же сервер не выдает никаких ошибок и строку тоже не грузит?
Ошибки нет - это понятно, сервер просто закончил импорт файла.

Последней строки нет - это тоже понятно - нет признака окончания очередной записи. Хотя там 100 мегабайт текста, он его не будет считать за очередную запись, если нет этого признака.

Есль такое распространённое мнение, что bcp предназначен для обмена данными внутри своей системы, а не для импорта внешних данных, поэтому за десятки лет туда не добавляли хоть какой то новой функциональности, малейшее отступление от простого формата делают его использование невозможным.

Любые другие средства импорта из CSV в MSSQL работают так же.

Я считаю это большим недостатком сиквела, можно было за 30 лет добавить импорт из внешних файлов :-) Хотя ошибок в данном случае нет, всё работает в соответствии с документацией.

Вам придётся либо давить на клиента, менять формат файла, либо делать импорт другими средствами (например, написать парсер, конвертирующий файл в нужный формат, благо в данном случае это несложно, всего лишь добавить перевод строки, можно даже сделать это простым cmd-файлом)
19 окт 12, 11:32    [13345325]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT не грузит последнюю строчку - как исправить?  [new]
Albatross
Member

Откуда:
Сообщений: 1001
alexeyvg,

Раньше мне часто встречалась ошибка "Обнаружен неожиданный конец файла" (Unexpected end of file found), когда строка обрубалась неожиданно.
А почему тут-то ничего такого нет?
19 окт 12, 11:53    [13345483]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT не грузит последнюю строчку - как исправить?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Albatross
alexeyvg,

Раньше мне часто встречалась ошибка "Обнаружен неожиданный конец файла" (Unexpected end of file found), когда строка обрубалась неожиданно.
А почему тут-то ничего такого нет?
Да, вот так вот :-)

Если стереть последний символ в вашем файле, то такая ошибка и появится, потому что DCP не сможет полностью считать последнюю запись.
А вот если этот символ добавить, то она считает посоледнюю запись, всё нормально! Но, правда, эту запись в базу не запишет, потому что нет конца файла.

Не спрашивайте меня, "почему" :-)

Более того, несмотря на то, что:
Glory
Строка для bulk insert заканчивается тогда, когда встречается заданный разделитель строк.
bulk insert не считает заданный ему разделитель строки признаком разделения строки :-)
Для того, что бы считал, нужно сочетание 2-х условий - (1) все поля предыдущей записи прочитаны полностью и (2) встретился разделитель строк.

Честно говоря, я не понимаю назначение разделителя строк - ведь следующая строка читается не раньше и не позже, чем прочитались все поля предыдущей строки, так что функционально (по существующему алгоритму работы bulk insert, который реально не может различать строки по наличию разделителя строки), можно было обойтись заданием только разделителя записей.
19 окт 12, 14:57    [13347207]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT не грузит последнюю строчку - как исправить?  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
Похоже, что это косяк реализации BULK INSERT, поскольку если последний символ любой другой, кроме разделителя полей (в данном случае 'I'), то загружаются обе строки, несмотря на отсутствия в конце разделителя строки.
Чтобы убедиться в этом - добавьте в конец, например, пробел.

Таким образом, формулируем баг - если файл оканчивается разделителем поля, то последняя строка файла не загружается посредством BULK INSERT.

Сообщение было отредактировано: 21 окт 12, 19:34
21 окт 12, 19:28    [13352999]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить