【问题标题】:SQL Server Bulk Insert EDI file - row order jumbledSQL Server 批量插入 EDI 文件 - 行顺序混乱
【发布时间】:2019-02-04 17:25:16
【问题描述】:

我正在使用 SQL Server 批量插入命令将带有终结符的 EDI 文件内容插入到我的表中,但是,有时顺序或行会变得混乱,例如:

BULK INSERT dbo.NDCArchitectBulkInsert 
FROM '\\FTP\\TestFiles\\abc' 
WITH (ROWTERMINATOR = '~')

文件(abc)内容:

Line 139   This is line 139~
Line 140   This is line 140~
...
Line 149   This is line 149~
Line 150   This is line 150~
Line 151   This is line 151~
...
Line 160   This is line 160~
Line 161   This is line 161~
Line 162   This is line 162~

批量插入后,我的表格行将是:

Line 139   This is line 139~
Line 140   This is line 140~
...
Line 149   This is line 149~
Line 160   This is line 160~
Line 161   This is line 161~
Line 150   This is line 150~
Line 151   This is line 151~
Line 162   This is line 162~

第 160 行和第 161 行不知何故在第 149 行和第 150 行之间插入/混乱,这似乎发生在随机行号上,我已经测试过它是否是数据问题,但不是……有人有任何相关的经验和解决方案吗在那个附近?

【问题讨论】:

  • 我假设您的目标表没有键或索引,对吗?无论如何,您都不应该关心数据在表中的存储顺序。如果您确实关心,则必须应用聚集索引。据我所知,批量插入不保证按“源顺序”保存记录
  • 您的 EDI 文件中是否有行号?它是必须按顺序出现的标题/详细信息类型结构吗?
  • @Brian,你说得对,我的目标表没有键或索引或行号,有人告诉我在批量插入时有 line_number 列不好。
  • @Nick.McDermaid,我的 EDI 文件中没有行号,它就像一个标题/详细信息类型的结构,但我不知道我的 BulkInsert 是否识别...
  • 你需要一个行号列。将IDENTITY 列添加到表中,然后创建一个视图,列出所有列除了 标识列,然后插入到该视图中。虽然我在任何地方都找不到任何技术保证,但这一直对我有用。

标签: sql sql-server bulkinsert edi


【解决方案1】:

他们没有被“混乱”插入。你怎么找回来的?啊,就是这个问题。结果集(如表格)本质上是无序的。因此,如果您只使用 select 查看数据,那么您可能会看到乱序。

最简单的解决方案是,如果第一列是行号或其他内容。然后你可以这样做:

select abc.*
from abc
order by abc.linenumber;

一切都会看起来不错。

编辑:

如果需要添加行号,可以加载到视图中。像这样的:

CREATE TABLE NDCArchitectBulkInsert (
    NDCArchitectBulkInsertId int identity(1, 1) primary key,
    . . .  -- rest of the columns
);

CREATE VIEW v_NDCArchitectBulkInsert as 
    SELECT . . .  -- rest of columns but not id
    FROM NDCArchitectBulkInsert;

BULK INSERT v_NDCArchitectBulkInsert 
FROM '\\FTP\\TestFiles\\abc' 
WITH (ROWTERMINATOR = '~');

我不能 100% 确定该行为是否得到保证,但我认为在实践中这会按插入顺序更新身份。

【讨论】:

  • 非常感谢!我的批量插入目标表就像一个没有 line_number 列(只有文本列)的临时表,您是否建议我应该在临时表中添加“行号”列?如果是这样,我的批量插入命令怎么可能? “批量插入”会自动按行号顺序插入吗?
  • @KevinDing,如果您需要按特定顺序获取数据,则必须在查询数据时指定。如果您只是输入select * from table,则无法说明数据的排序方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多