你可以BCP导入记录的顺序与平面文件相同吗?

时间:2014-03-19 00:49:27

标签: tsql sql-server-2012 bcp

我正在尝试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中插入我必须遵循与平面文件相同的顺序。这可能吗?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我以前可以回想起的当前文档和文档已经声明,BCP实用程序将假设没有加载提示来指定文件中的数据顺序(这将需要导入表上的聚簇索引)如果,数据在文件中未排序。

因此,我认为您不应该假设BCP将按顺序加载数据。这主要是因为存储引擎的需求如何影响数据的读取和存储。对于非常大的文件(VL可能取决于您的系统资源),存储引擎可能一次将数据写入多个页面(或类似的内容......不确定内部...但我知道他们不应该被假设。)

没有任何声明(我可以找到)来自MS,声明SQL" WILL"保持相同的顺序,只提到SQL"不会假设"相同的订单足以永远不会假设相同的订单......我会说。

文件越小,我就越有可能摆脱这种我敢打赌的假设。

答案 2 :(得分:0)

您可以通过BCP将数据放入具有附加列(称为“ row_nbr”)的表中来实现此目的,该列也是一个标识列(希望您还没有列)。从该表创建格式文件时,只需将文件中此字段的目标列设置为零,就可以告诉BCP忽略身份列(我们将其命名为“ row_nbr”)。 / p>

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”列来保存文件顺序。