我有400个带分号的csv文件作为分隔符。
示例:列标题(Excel中的一个字段中全部):
CUST_NAME;Transdate;Transnum;UNIT_PRICE;QTY;STYLE_NUMBER;country
Excel文件中的示例数据(全部在一列中):
Bar Clayn;2012-01-01 00:00:00.0;45724;-109.98;-1;803702;CA
EAL AN;2012-01-01 00:00:00.0;48772;-69.98;-1;837642;CA
我已经引用了这篇文章,用于将多个csv文件导入SQL:
由于它是以分号分隔的文件,因此我为批量插入创建了一个格式文件。
该文件如下所示:
10.0
7
1 SQLCHAR 2 500 ";" 1 CUST_NAME Latin1_General_CI_AS
2 SQLDATETIME 1 8 ";" 11 Transdate ""
3 SQLCHAR 2 500 ";" 12 Transnum Latin1_General_CI_AS
4 SQLDECIMAL 1 19 ";" 19 UNIT_PRICE ""
5 SQLINT 1 4 ";" 20 QTY ""
6 SQLBIGINT 1 8 ";" 22 STYLE_NUMBER ""
7 SQLCHAR 2 500 ";" 28 country Latin1_General_CI_AS
循环遍历一个文件夹中所有文件的代码可以正常工作,但我认为我的fmt文件有问题,因为它给我带来了如下错误:
Msg 4866,Level 16,State 7,Line 1
批量加载失败。第1行第1列的数据文件中的列太长 验证是否正确指定了字段终止符和行终止符。
代码是:
CREATE TABLE ALLFILENAMES(WHICHPATH VARCHAR(255),WHICHFILE varchar(255))
--some variables
declare @filename varchar(255),
@path varchar(255),
@sql varchar(8000),
@cmd varchar(1000)
--get the list of files to process:
SET @path = 'C:\Sales\2012\'
SET @cmd = 'dir ' + @path + '/b/a-d'
INSERT INTO ALLFILENAMES(WHICHFILE)
EXEC Master..xp_cmdShell @cmd
UPDATE ALLFILENAMES SET WHICHPATH = @path where WHICHPATH is null
--cursor loop
declare c1 cursor for SELECT WHICHPATH,WHICHFILE FROM ALLFILENAMES where WHICHFILE is not null
open c1
fetch next from c1 into @path,@filename
While @@fetch_status <> -1
begin
--bulk insert won't take a variable name, so make a sql and execute it instead:
set @sql = 'BULK INSERT Sales2012 FROM ''' + @path + @filename + ''' '
+ ' WITH (
FORMATFILE =''C:\Sales2012.fmt''
)'
print @sql
exec (@sql)
fetch next from c1 into @path,@filename
end
close c1
deallocate c1
它与SQL Server导入向导完美配合:
Test Qualifier: "
Header row Delimiter: {CR}{LF}
我可以使用导入向导执行此操作,但考虑到400多个csv文件,加载这些文件需要几天时间。我做错了吗?
感谢任何帮助。
答案 0 :(得分:0)
这很可能是在数据中某处没有正确解析的逗号字符的情况。
尝试在记事本中打开您的CSV文件,看看它的内部结构是什么样的,以及用于转义逗号和引号字符的字符。
您可以做的另一件事是修改光标以打印INSERT语句VS进行实际插入。这将允许您跟踪特定导致问题的行并解决该问题。