如何确保BULK INSERT按顺序插入平面文件的行?

时间:2016-06-09 13:04:02

标签: sql sql-server

我有一个由多行文本组成的平面文件,没有字段分隔符(我按位置解析它们)和换行符作为行分隔符。基本上,这样的事情:

FIELD1AFIELD2AFIELD3AFIELD4A...
FIELD1BFIELD2BFIELD3BFIELD4B...
FIELD1CFIELD2CFIELD3CFIELD4C...

在使用此命令将其解析到最终表之前,我将它大量插入临时表中:

BULK INSERT TEMPTABLE
FROM 'c:\location\file' 
WITH (FIELDTERMINATOR= '',ROWTERMINATOR = '\n',MAXERRORS = 0)

现在,第一行和最后一行用作文件的标题和尾部,并包含特殊信息。因此,它们不遵循“FIELD1AFIELD2AFIELD3AFIELD4A ......”的相同模式,因此我需要考虑它们。此外,我需要专门在另一个表中插入标题行的信息。

但是当我运行批量插入时,行不会按顺序插入到时态表中,所以我不能只假设顶部寄存器是标题,最后一个寄存器是预告片。

有没有办法强制批量插入符合平面文件中行的顺序?我没有“键列”,也没有索引,也没有文件中的任何内容,并且在这个文件中插入行号是不可能的(我需要保留它,因为它被收到,而且它太大了,无法复制或修改它反正)。

由于

2 个答案:

答案 0 :(得分:3)

我记得(暂时没有这样做)以下是适用于我的步骤:

  1. 请勿使用临时表,而是使用永久表(如果需要,请使用名称Temp_<something>),在使用BULK INSERT之前,只需删除/截断。

  2. 更改Temp_<something>以添加ID列,并使其成为此表的群集主键。

  3. 创建视图:

  4. CREATE VIEW Temp_something_View As
        SELECT
              (every column EXCEPT the ID column)
        FROM Temp_something
    
    GO
    

    1. 现在BULK INSERT到View而不是表。
    2. 现在ID值最低和最高的行应该是输入源的第一行和最后一行。

      当您需要源输入顺序中的行时,只需使用ORDER BY ID从表中选择。否则,它将根据某些物理分配约束返回它们,而不是按照您想要的逻辑顺序返回它们。

答案 1 :(得分:0)

确保您从源数据集中以正确的顺序选择数据。