代码之家  ›  专栏  ›  技术社区  ›  Arturo Caballero

大容量插入带有回车的文本字段的文件(回车)

  •  1
  • Arturo Caballero  · 技术社区  · 15 年前

    i_´m在大容量插入数据类型文本中包含字段的文件时遇到问题,它保存输入,字段的分隔符是管道“”,行终止符是“\n”

    我得到文本字段旁边的字段的截断错误。我认为大容量插入认为第二个字段中的输入是下一行。

    DECLARE @sql varchar(2000)
    PRINT 'xyz table'
    SET @sql = 
    'BULK INSERT xyz 
       FROM ''\\' + @@servername + '\Import\xyz.txt''
       WITH 
          (
                    DATAFILETYPE   = ''char'',
                    FIELDTERMINATOR         = ''|'',
                    ROWTERMINATOR           = ''|\n'',
                    TABLOCK,
                    ROWS_PER_BATCH         = 2000,
                    MAXERRORS      = 1000
    
                    )
    '
    PRINT @sql
    EXECUTE (@sql)
    PRINT ''
    GO
    

    这是数据示例

    467507**|**08-20-09\
    [8:55:03 AM] *** miked@wkaiser-6793 is Not Available [Ext. away]\(CR)
    [9:00:57 AM] *** miked@wkaiser-6793 is Online [Online]\(CR)
    [9:01:00 AM] <jeffp> Howdy.  Time slip update game!  Update TS#467493 & 467507 with a (CR)comment and see if you win! [9:01:30 AM] *** miked@wkaiser-6793 is Away [Away]\
    \(CR)
    08-18-09\(CR)
    [10:13:15 AM] *** miked@wkaiser-6793 is Online [Online]\(CR)
    [10:13:59 AM] <jeffp> Howdy; welcome back from lunch..  Just pinging you for an update in TS#467493 & 467507.  Since 467493 is pri9, want a stock e-mail to go out to the customer to get them moving?\(CR)
    [10:14:47 AM] <miked@wkaiser-6793> thats ok i got it\(CR)
    [10:14:53 AM] <jeffp> Aiight.**|**2009-08-18 00:00:00**|**2009-08-20 00:00:00**|**JDP**|**JDP**|**
    

    表架构是:

    create table xyz
      (
        xyz_id VARCHAR(200), --INT TO VARCHAR
        notes text,
        create_date varchar(32), --DATETIME
        create_user varchar(12),
        modify_date varchar(32), --DATETIME
        modify_user varchar(12)
      )
    

    正如您所看到的(好吧,看不到)有输入(用cr标记),大容量插入将它们与新行混淆。

    如有任何帮助,我们将不胜感激。

    谢谢

    2 回复  |  直到 15 年前
        1
  •  1
  •   Peter Radocchia    15 年前

    编辑:你 不要 需要格式化文件:

    IF OBJECT_ID('tempdb..#rawdata') IS NOT NULL DROP TABLE #rawdata
    create table #rawdata (
      xyz_id VARCHAR(200)
    , notes text
    , create_date varchar(32)
    , modify_date varchar(32)
    , create_user varchar(12)
    , modify_user varchar(12)
    )
    
    BULK INSERT #rawdata 
    FROM 'C:\temp\file.txt'
    WITH (
        FIELDTERMINATOR = '**|**'
      , ROWTERMINATOR = '**|**\n'
      , TABLOCK
      )
    
    SELECT * FROM #rawdata
    

    你可能需要玩 **|**\n (LF)VS **|**\r\n (CRLF)VS **|**\r (cr),取决于文件是unix、dos还是mac-like。

    编辑

    没有格式文件是无法完成的。因此,创建一个格式文件:

    8.0
    7
    1 SQLCHAR 0 0 "**|**" 1 xyz_id        ""
    2 SQLCHAR 0 0 "**|**" 2 notes         ""
    3 SQLCHAR 0 0 "**|**" 3 create_date   ""
    4 SQLCHAR 0 0 "**|**" 4 modify_date   ""
    5 SQLCHAR 0 0 "**|**" 5 create_user   ""
    6 SQLCHAR 0 0 "**|**" 6 modify_user   ""
    7 SQLCHAR 0 0 "\n"    0 omitted       ""
    

    然后:

    IF OBJECT_ID('tempdb..#rawdata') IS NOT NULL DROP TABLE #rawdata
    create table #rawdata (
      xyz_id VARCHAR(200)
    , notes text
    , create_date varchar(32)
    , modify_date varchar(32)
    , create_user varchar(12)
    , modify_user varchar(12)
    )
    
    BULK INSERT #rawdata 
    FROM '\\folder\file.txt'
    WITH (
        FORMATFILE = '\\folder\file.fmt'
      , TABLOCK
      )
    

    或者,在SQL 2005+中:

    SELECT * FROM OPENROWSET(
        BULK '\\folder\file.txt'
      , FORMATFILE = '\\folder\file.fmt'
      ) a
    
        2
  •  1
  •   gbn    15 年前

    数据不一致。你有一些行尾 \(cr) 一个字段,另一个字段 (cr) 以列分隔符结尾

    或者您有不一致的列分隔符, (CR) 一些 | . 如果是这样,那么你需要一个 format file 处理每个单独的“列”。

    推荐文章