2013-12-09 77 views
0

我一直在试图导入数据(制表符分隔)到SQL服务器。源数据是从IBM Cognos导出的。数据可以从以下网址下载:sample dataBCP /批量插入失败(制表符分隔文件)

我试过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可能无法实现,但肯定有一些命令行软件可用。只是谷歌它。 –

+0

我正在寻找!当我找到东西的时候,会在这里发布。谢谢 – DataRiver

2

刚才保存文件为.csv和批量插入下面的语句。

​​

返回的消息

(22587 row(s) affected) 

加载的数据

enter image description here

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

+0

添加分隔符(管道)可能不太可行。 – DataRiver

+0

您是否知道使用命令行中的“管道”保存此制表符分隔文件的方法,或者不需要手动干预的方法? – DataRiver

+1

该文件已被标记为“.csv”,但采用制表符分隔的格式。你的意思是你在Excel中手动打开它,然后将它重新保存为CSV?不幸的是,你不能每次都手动完成。真正的解决办法是首先得到正确的输出,所以你不必在两者之间执行手动步骤...... –

0

好吧,所以,这是一个看似简单的任务,将分隔数据从平面文件推送到SQL服务器。我认为BCP是要走的路(我早些时候使用它并成功)。

建议内容的简要说明: a。修复源文件 b。以本地Excel格式保存源数据 c。将源数据保存为管道分隔数据

我尝试了所有选项,但是它向我的进程添加了多个步骤,但是可以执行。

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

} 

感谢您的帮助!