我一直在尝试将数据(制表符分隔)导入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
提前感谢您的帮助@
答案 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的墙上,并希望它能顺利处理它:
答案 1 :(得分:2)
刚刚将您的文件保存为.CSV并使用以下语句批量插入。
BULK INSERT dim_assessment FROM 'C:\Blabla\TestFile.csv'
WITH (
FIRSTROW = 2,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
);
GO
返回消息
(22587 row(s) affected)
已加载数据
请注意,来自ICD名称的一些数据已经溢出到LoadDate列中,只需使用|
管道字符来消除并使用与FIELDTERMINATOR = '|'
和欢乐日相同的批量插入语句。
答案 2 :(得分:0)
通过Excel打开文件显示以下内容:
我想在这些条件下,批量插入可能无法正常工作。由于Excel似乎以非常简洁的方式管理您的文件,您应该考虑额外的步骤,从CSV到Excel再到数据库。
答案 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
}
感谢您的帮助!