【问题标题】:Can you BCP import records in the same order as a flat file?您可以按照与平面文件相同的顺序 BCP 导入记录吗?
【发布时间】:2014-04-25 00:04:47
【问题描述】:

我正在尝试 BCP IN 一个平面文件,该文件必须保持文件中的序列。例如,平面文件中的第 1 行必须在表的第 1 行中。

然后,我会在插入它们时为它们分配身份,因为我知道它们的顺序。但是,根据我的研究,根据链接,排序是 ASC 或 DESC: http://msdn.microsoft.com/en-us/library/ms162802(v=sql.105).aspx

-h"ORDER(column[ASC | DESC] [,...n])"

我不想插入 ASC 或 DESC,我必须遵循与平面文件相同的顺序。这可能吗?

【问题讨论】:

  • 我相信如果你省略任何排序,它将从文件中导入而不改变,但我可能是错的。

标签: tsql sql-server-2012 bcp


【解决方案1】:

bcp 应该按照与平面文件中完全相同的顺序将数据添加到您的数据库表中。因此,您可以在 bcp 语句中完全省略 -h 参数。

【讨论】:

  • 这不是真的。在处理少量数据时,这似乎可行,但在数据量足够大的情况下,SQL Server 会将数据写入不同的页面,并以不同于从文件中读取的顺序写入数据。但这与将数据从一个表移动到另一个表没有什么不同。
【解决方案2】:

您可以通过 BCP 将数据放入带有额外列(称为“row_nbr”)的表中来实现此目的,该列也是标识列(希望您还没有)。当您从该表创建格式文件时,您只需通过将文件中此字段的目标列设置为零来告诉 BCP 忽略标识列(我们将其命名为“row_nbr”)......就像这样:

11.0
2
1       SQLCHAR             0       8000    ""       1     LINE_DATA              SQL_Latin1_General_CP1_CI_AS
2       SQLCHAR             0       12      "\r\n"   0     ROW_NBR                ""

关键是将 ROW_NBR 字段的目标设置为 0(见,就在行终止符之后)。我通常会在“暂存”表或临时/临时表中执行此操作,以保存刚刚加载的数据,然后再插入最终数据库存储。

现在,并不能真正说明数据存储的顺序,但这并不重要。只需将其留给 SQL Server。您需要做的就是在查询数据时使用“ROW_NBR”字段对结果进行排序。

标识列将按读取顺序接收行,但是您几乎无法强制 SQL 将记录存储在文件中,因为它们存储在文件中(当然,如果两者都存储在文件中,则例外情况是数据和您的表共享由数据的聚集索引/顺序定义的排序顺序。您不需要此“row_nbr”列来保留您的文件顺序)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 2021-09-28
    相关资源
    最近更新 更多