2013-10-04 3 views
1

Я пытаюсь нагрузить в таблицу MS SQL значение из файла .txt, который находится в довольно сложном формате. В приведенном ниже примере показаны первые два раздела файла, но это повторяется более 100 раз по всему файлу. Заголовки расположены в верхней части каждой секции. Есть ли способ справиться с этим? Столбцы сами по себе являются фиксированной длиной, но мне нужно сказать, что SQL может принимать значения из таблиц и игнорировать заголовки. Какие-нибудь идеи вообще?Массовая вставка в MS SQL Server из нерегулярного плоского файла

Пример формата файла:

Example screen shot here

Спасибо заранее.

+0

Вам нужно показать свои навыки кодирования здесь, какую помощь вы хотите от нас? – Anand

+0

, если вы запрашиваете поток, это должно быть следующим образом: 1.get txt-файл в streamreader, 2.split string by character | 3.if string [0] = choc_id, затем взять данные из следующей строки 4. вставить и сделать. – Anand

+0

Спасибо Ананд. У меня не было предыдущего опыта работы с SQL Stream, поэтому я надеялся, что смогу справиться с этим через встроенный скрипт или пакет SSIS. Если бы я мог получить содержимое данных в таблицах в таблицу SQL, я мог бы выполнить оставшуюся часть работы в хранимой процедуре. Я просто пытаюсь определить, как его получить, но игнорировать повторяющиеся заголовки. – user2519924

ответ

0

Параметр bcp.exe или BULK INSERT не содержит параметров или фильтров, которые позволяют отфильтровывать нежелательные строки. Таким образом, вам нужно выполнить предварительную или пост-обработку.

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

С постобработкой вы загружаете файл, как он есть, в SQL Server (включая нежелательные строки), а затем удаляете ненужные строки из таблицы. В зависимости от ваших потребностей вы можете использовать для этого промежуточную (временную) таблицу.

Сначала создайте format file для использования с объемной вставкой. С вашего ввода, похоже, вы можете использовать формат фиксированного размера, который хорош в этом случае. Вы можете пойти в заблуждение, используйте столбец date для столбца «END on» в вашей таблице и просто игнорируйте любые ошибки. Поскольку ни одна из других строк не содержит допустимого формата даты, вы можете использовать это как грубый фильтр. Все остальные способы, для которых вам понадобится определение таблицы, которое использует только столбцы char (n) (var).

С таким столом можно просто загрузить файл, то используйте WHERE фильтр, чтобы удалить что-либо недопустимое при передаче данных в реальную таблицу, как это:

INSERT INTO MyRealTable 
    SELECT CHOC_ID, EndOn, ... 
    FROM #TempBulkTable 
    WHERE CHOC_ID NOT IN ('untime', '---------------', ...) 

Или вы Коули указать FIRE_TRIGGERS в своем объеме вставьте и дайте таблице INSTEAD OF INSERT триггер, который выполняет фильтрацию, хотя этот вид поражает цель объемной вставки. Если вы используете временную таблицу, убедитесь, что у вас достаточно места в tempdb.

Надеюсь, это даст вам полезные идеи.

+0

Perfect. Это дало мне много вдохновения. Мне нравится предложение даты. Сегодня я пойду. Большое спасибо. – user2519924

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