【问题标题】:Bulk Insert Multiple Semicolon Delimited Files into SQL Server将多个分号分隔的文件批量插入 SQL Server
【发布时间】:2013-08-14 13:18:30
【问题描述】:

我有 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:

Stackflow

因为它是一个分号分隔的文件,所以我创建了一个用于批量插入的格式文件。

文件如下所示:

    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 文件有问题,因为它给了我如下错误:

消息 4866,第 16 级,状态 7,第 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 文件,我需要几天时间才能加载这些文件。我是不是做错了什么?

感谢任何帮助。

【问题讨论】:

  • 为什么你的第一个 fieldterminator 是空白的?
  • @Aaron 已更改.. 这是一个错字..
  • 尝试将格式文件中的最后一个字段终止符更改为"\r\n"
  • 为什么不用 SSIS 来代替呢?
  • @AaronBertrand 我得到了同样的错误.. 可能所有数据都在 excel 文件的一列中,用分号分隔?

标签: sql sql-server tsql csv import


【解决方案1】:

这很可能是在未正确解析的数据中某处包含逗号字符的情况。

尝试在记事本中打开 CSV 文件,看看它的内部结构是什么样的,以及使用哪些字符来转义逗号和引号字符。

您可以做的另一件事是修改光标以打印 INSERT 语句 VS 进行实际插入。这将允许您跟踪具体是哪一行导致问题并解决该问题。

【讨论】:

  • 该文件中没有逗号,也没有引号字符。 ://
  • 如果没有rowterminator/,请参考这篇文章StackFlow。谢谢特伦斯。
猜你喜欢
  • 2016-01-20
  • 2018-08-02
  • 2018-07-23
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多