2013-12-09 3 views
0

Я пытаюсь импортировать данные (с разделителями табуляции) в SQL-сервер. Исходные данные экспортируются из IBM Cognos. Данные можно загрузить с: sample dataBCP/Bulk Insert Fails (файл с разделителями табуляций)

Я пробовал BCP/Bulk Insert, но это не помогло. Исходный файл данных содержит строку заголовка (которая должна быть пропущена).

================================== Схема:

CREATE TABLE [dbo].[DIM_Assessment](
[QueryType] [nvarchar](4000) NULL, 
[QueryDate] [nvarchar](4000) NULL, 
[APUID] [nvarchar](4000) NULL, 
[AssessmentID] [nvarchar](4000) NULL, 
[ICDCode] [nvarchar](4000) NULL, 
[ICDName] [nvarchar](4000) NULL, 
[LoadDate] [nvarchar](4000) NULL 
) ON [PRIMARY] 
GO 

== =========================== Формат файла генерируется с помощью следующей команды

bcp [dbname].dbo.dim_assessment format nul -c -f C:\config\dim_assessment.Fmt -S <IP> -U sa -P Pwd 

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

11.0 
7 
1  SQLCHAR    0  8000 "\t"  1  QueryType     SQL_Latin1_General_CP1_CI_AS 
2  SQLCHAR    0  8000 "\t"  2  QueryDate     SQL_Latin1_General_CP1_CI_AS 
3  SQLCHAR    0  8000 "\t"  3  APUID      SQL_Latin1_General_CP1_CI_AS 
4  SQLCHAR    0  8000 "\t"  4  AssessmentID     SQL_Latin1_General_CP1_CI_AS 
5  SQLCHAR    0  8000 "\t"  5  ICDCode      SQL_Latin1_General_CP1_CI_AS 
6  SQLCHAR    0  8000 "\t"  6  ICDName      SQL_Latin1_General_CP1_CI_AS 
7  SQLCHAR    0  8000 "\r\n" 7  LoadDate      SQL_Latin1_General_CP1_CI_AS 

====================== ==============

Я попытался импортировать данные, используя BCP/Bulk Insert, однако, они не работали.

bcp [dbname].dbo.dim_assessment IN C:\dim_assessment.dat -f C:\config\dim_assessment.Fmt -S <IP> -U sa -P Pwd 

BULK INSERT dim_assessment FROM '\\dbserver\DIM_Assessment.dat' 
WITH (
    DATAFILETYPE = 'char', 
    FIELDTERMINATOR = '\t', 
    ROWTERMINATOR = '\r\n' 
); 
GO 

Заранее спасибо за помощь @

+1

Что означает «никто из них не работает»? Вы получили сообщение об ошибке? Если так, то, что это? –

+0

Да, в настоящее время я не могу импортировать данные с помощью SSIS. Мы рассматриваем автоматизированный способ импорта данных, сохраненных в сети, на SQL-сервер. – DataRiver

+2

Я не уверен, как этот ответ отвечает на любой из моих вопросов. –

ответ

3

Ваш входной файл находится в ужасном виде.

В файле формата и вашей команде BULK INSERT указано, что конец строки должен быть комбинацией возврата каретки и строки и что имеется семь столбцов данных. Однако, если вы откроете свой CSV-файл в «Блокноте», вы быстро увидите, что возврат каретки и линейные фиды не отображаются правильно в Windows (это значит, что они должны быть чем-то иным, чем точно \r\n). Вы также можете видеть, что есть на самом деле не семь столбцов данных, но пять:

QueryType QueryDate APUID AssessmentID ICDCode ICDName LoadDate 
PPIC 2013-11-20 10:23:14 11431 10963  Tremors 
PPIC 2013-11-20 10:23:14 11431 11299  THUMB PAIN 
PPIC 2013-11-20 10:23:14 11431 11348  Environmental allergies 
... 

Just looking at it visually you can tell it isn't right, и вам нужно, чтобы получить лучший исходный файл, прежде чем выбросить его через стену в SQL Server и ожидая, что для обработки она плавно:

enter image description here

+0

Я не знаю, что сказать. Вероятно, как объяснили другие, некоторые столбцы отсутствуют/пусты, поэтому вы видите файл данных в этом плохом формате? – DataRiver

0

Открытие файла с помощью Excel показывает следующее:

  • Есть на самом деле 7 строк заголовков
  • только первые шесть из них заселенных
  • Колонок 1, 2 и 3 выполнен одинаковые значения
  • Существует несколько запутанных данных, где пятая колонна может быть либо пустой, или заполнены цифрами, или заполнены текстом.

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

enter image description here

+0

Вау, я очень рад это видеть. Когда вы говорите, что должен быть дополнительный шаг, существует ли способ сохранить файл с разделителями табуляции в виде файла с разделителями «запятая» в excel, а затем импортировать данные из командной строки? Если это произойдет, я золото! – DataRiver

+0

Вам следует попробовать попробовать «сохранить как» в Excel. Если вы можете сделать это вручную, это означает, что есть способ сделать это программно. простой T-SQL может не сделать трюк, но, конечно же, доступно некоторое программное обеспечение командной строки. Просто пойдите в Google. –

+0

Я ищу! когда я найду что-то, опубликую его здесь.Спасибо – DataRiver

2

Просто Сохраненный файл в формате .csv и навалочных вставленный со следующим утверждением.

BULK INSERT dim_assessment FROM 'C:\Blabla\TestFile.csv' 
WITH (
    FIRSTROW = 2, 
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
); 
GO 

Возвращается сообщение

(22587 row(s) affected) 

Загруженные данные

enter image description here

Просто обратите внимание, что некоторые данные от имени МКБ имеет облета в LoadDate колонке, Просто используйте | трубу символ, чтобы разграничить и используйте ту же самую инструкцию вставки вставки с FIELDTERMINATOR = '|' и счастливыми днями.

+0

Возможно, нецелесообразно добавить разделитель (трубу). – DataRiver

+0

Знаете ли вы, как сохранить этот файл с разделителями табуляции с «трубами» из командной строки или что-то, что не потребует ручного вмешательства? – DataRiver

+1

Файл уже был помечен как «.csv», но в формате с разделителями табуляции. Вы имеете в виду, что вы открыли его вручную в Excel, а затем повторно сохранили его как CSV? К сожалению, вы не можете делать это вручную каждый раз. Реальное решение состоит в том, чтобы получить правильный вывод в первую очередь, поэтому вам не нужно выполнять ручные шаги между ... –

0

Итак, это была, казалось бы, простая задача, чтобы выталкивать данные с разделителями с плоского файла на SQL-сервер. Я думал, что BCP - это путь (я использовал его раньше и был успешным).

Быстрое изложение того, что было предложено: a. исправить исходный файл b. сохранение исходных данных в собственном формате excel c. сохраняя исходные данные в виде данных с разделителями-ограничителями.

Я пробовал все варианты, но добавлял несколько шагов к моему процессу, но был способен.

Я наткнулся на invoke-sqlcmd & import-csv commandlets из powershell. Оказывается, я могу импортировать данные с помощью powershell напрямую. на данный момент это немного медленно, но я могу жить с этим пока.

$DATA=IMPORT-CSV dim_assessment.CSV -Delimiter "`t" 

FOREACH ($LINE in $DATA) 

{ 
$QueryType="`'"+$Line.QueryType+"`'" 
$QueryDate="`'"+$Line.QueryDate+"`'" 
$APUID="`'"+$Line.APUID+"`'" 
$AssessmentID="`'"+$Line.AssessmentID+"`'" 
$ICDCode="`'"+$Line.ICDCode+"`'" 
    $ICDName=$Line.ICDName 
    $ICDName = $ICDName.replace("'","''") 
$ICDName="`'"+$ICDName+"`'" 
$LoadDate="`'"+$Line.LoadDate+"`'" 

$SQLHEADER="INSERT INTO [dim_assessment] ([QueryType],[QueryDate],[APUID],[AssessmentID],[ICDCode],[ICDName],[LoadDate])" 
$SQLVALUES="VALUES ($QueryType,$QueryDate,$APUID,$AssessmentID,$ICDCode,$ICDName,$LoadDate)" 

$SQLQUERY=$SQLHEADER+$SQLVALUES 
Invoke-Sqlcmd –Query $SQLQuery -ServerInstance HA -U sa -P Pwd 

} 

Спасибо за вашу помощь!

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