簡體   English   中英

將多個用分號分隔的文件批量插入SQL Server

[英]Bulk Insert Multiple Semicolon Delimited Files into SQL Server

我有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文件有問題,因為它給了我以下錯誤:

消息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文件,加載這些文件需要花費我幾天的時間。 我做錯什么了嗎?

任何幫助表示贊賞。

這很可能是在未正確解析的數據中的某處具有逗號字符的情況。

嘗試在記事本中打開CSV文件,看看其內部結構如何,以及用什么字符轉義逗號和引用字符。

您可以做的另一件事是修改光標以打印INSERT語句VS進行實際的插入。 這樣,您就可以跟蹤引起問題的行並進行修復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM