Массовая вставка SQL игнорирует первую строку данных - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь импортировать файл с разделителем конвейера во временную таблицу, используя массовую вставку (UTF-8 с разделителем строк в стиле Unix), но он продолжает игнорировать первую строку данных (одну после заголовка), и я незнаю, почему. Добавление | к строке заголовка также не поможет ...

Содержимое файла:

SummaryFile_20191017140001.dat|XXXXXXXXXX|FIL-COUNTRY|128
File1_20191011164611.dat|2|4432|2|Imported||
File2_20191011164611.dat|3|4433|1|Imported||
File3_20191011164611.dat|4|4433|2|Imported||
File4_20191011164611.dat|5|4434|1|Imported|INV_ERROR|
File5_20191011164611.dat|6|4434|2|Imported||
File6_20191011164611.dat|7|4434|3|Imported||

Массовая вставка не вызывает ошибок, но она продолжает игнорировать первую строку данных (File1_...)

SQL ниже:

IF OBJECT_ID('tempdb..#mycsv') IS NOT NULL
DROP TABLE #mycsv

create table #mycsv
    (
        tlr_file_name   varchar(150) null,
        tlr_record_id   int null,
        tlr_pre_invoice_number  varchar(50) null,
        tlr_pre_invoice_line_number varchar(50) null,
        tlr_status  varchar (30) null,
        tlr_error_code  varchar(30) null,
        tlr_error_message   varchar (500) null)

bulk insert #mycsv 
from 'D:\TestData\Test.dat' 
with (
    rowterminator = '0x0A',
    fieldTerminator = '|',
    firstrow = 2, 
    ERRORFILE = 'D:\TestData\Import.log')

select * from #mycsv

Это действительно беспокоит меня, так как я не знаю, что мне не хватает. Если я укажу FirstRow = 1 -ый скрипт выдаст: Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 1, column 2 (tlr_record_id).

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

Ответы [ 2 ]

2 голосов
/ 22 октября 2019

«UTF-8 с разделителем строк в стиле Unix» Я предполагаю, что вы используете версию SQL Server, которая не поддерживает UTF-8. От ОБЪЕМНАЯ ВСТАВКА (Transact-SQL)

** Важно ** Версии до SQL Server 2016 (13.x) не поддерживают кодовую страницу65001 (кодировка UTF-8).

Если вы используете 2016+, укажите кодовую страницу для UTF-8:

BULK INSERT #mycsv
FROM 'D:\TestData\Test.dat'
WITH (ROWTERMINATOR = '0x0A',
      FIELDTERMINATOR = '|',
      FIRSTROW = 1,
      CODEPAGE = '65001',
      ERRORFILE = 'D:\TestData\Import.log');

Есливы не используете SQL Server 2016+, тогда вы не можете использовать BULK INSERT для импорта файла UTF-8 ;вам придется использовать другую кодовую страницу или другой инструмент.


Обратите также внимание, что в приведенном выше документе указано следующее:

Атрибут FIRSTROW не являетсяпредназначен для пропуска заголовков столбцов. Пропуск заголовков не поддерживается оператором BULK INSERT. При пропуске строк ядро ​​СУБД SQL Server смотрит только на разделители полей и не проверяет данные в полях пропущенных строк.

если вы пропускаете строки, вам все равно нужно убедиться, чтострока действительна, но она не предназначена для пропуска заголовков. Это означает, что вы должны использовать FIRSTROW = 1 и исправлять строку заголовка, как указывает @sarlacii.

Конечно, это не решает проблему кодовой страницы, если вы используете более старую версию SQL Server;и я считаю, что вам придется использовать другую технологию в 2014 году и ранее.

0 голосов
/ 22 октября 2019

Чтобы эффективно импортировать строки в базу данных SQL, важно, чтобы форматирование заголовка соответствовало строкам данных. Добавьте отсутствующие разделители, например, в заголовок и попробуйте импортировать снова:

SummaryFile_20191017140001.dat|XXXXXXXXXX|FIL-COUNTRY|128|||

Количество полей в заголовке и поля данных должны совпадать, иначе строка игнорируется, а строкаПервая удовлетворительная строка «data» будет считаться заголовком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...