BCP /批量插入失败(制表符分隔文件)

时间:2013-12-09 22:04:51

标签: sql sql-server bulkinsert bcp tab-delimited

我一直在尝试将数据(制表符分隔)导入SQL服务器。源数据从IBM Cognos导出。可以从以下网址下载数据:sample data

我尝试过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

提前感谢您的帮助@

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

请注意,来自ICD名称的一些数据已经溢出到LoadDate列中,只需使用|管道字符来消除并使用与FIELDTERMINATOR = '|'和欢乐日相同的批量插入语句。

答案 2 :(得分:0)

通过Excel打开文件显示以下内容:

  • 确实有7个行标题
  • 只填充前六个
  • 第1,2和3列具有相同的值
  • 有一些令人困惑的数据,其中第五列可以是空的,也可以是数字,或填充文本。

我想在这些条件下,批量插入可能无法正常工作。由于Excel似乎以非常简洁的方式管理您的文件,您应该考虑额外的步骤,从CSV到Excel再到数据库。

enter image description here

答案 3 :(得分:0)

好的,这是一个看似简单的任务,将分隔数据从平面文件推送到SQL服务器。我认为BCP是要走的路(我之前用过它并且很成功)。

快速了解建议的内容: 一个。修复源文件 湾以原生excel格式保存源数据 C。将源数据保存为管道分隔数据

我尝试了所有选项,但是,它为我的流程添加了多个步骤,但是可行。

我偶然发现了invoke-sqlcmd&amp;来自powershell的import-csv命令行开关。事实证明,我可以直接使用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

}

感谢您的帮助!