用户在本地执行以下bcp命令将数据导入Server数据库。
bcp TEST_DB.dbo.TEST_TABLE IN TEST_TABLE.dat -N -T
通常,命令提示符窗口可以显示输出消息,如下所示。
( Server数据库使用的是简单恢复模型。)
================================================================================
Starting copy...
1000 rows sent to SQL Server. Total sent: 1000
1000 rows sent to SQL Server. Total sent: 2000
1000 rows sent to SQL Server. Total sent: 3000
1000 rows sent to SQL Server. Total sent: 4000
1000 rows sent to SQL Server. Total sent: 5000
1000 rows sent to SQL Server. Total sent: 6000
1000 rows sent to SQL Server. Total sent: 7000
1000 rows sent to SQL Server. Total sent: 8000
1000 rows sent to SQL Server. Total sent: 9000
1000 rows sent to SQL Server. Total sent: 10000
1000 rows sent to SQL Server. Total sent: 11000
1000 rows sent to SQL Server. Total sent: 12000
12406 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total : 75 Average : (165413.3 rows per sec.)
================================================================================问题是,当用户执行bcp将数百万行导入到表中时,他发现需要很长时间才能看到消息"XXXXX行“。就会出现。因此,在bcp完成之前,他决定故意关闭命令提示符窗口(单击窗口右上角的"X“按钮)。没有调用Ctrl击键。
这种出乎意料的行为会引发什么问题?
发布于 2017-05-23 04:39:31
在根据我的同事描述的情况运行了一些实验之后,我认为可以得出这样的结论:通过在完成之前关闭BCP窗口,BCP进程实际上被终止,并回滚bulk insert命令。但可能需要一些时间来解释为什么他能得到他想要的数据。
根据他的描述和对数据库设置的一些评估,以下是昨天发生的情况:
根据索引的存在,当使用BCP将数据行导入到表中时,它们将在不同的阶段插入到目标表中。可以通过运行以下SQL语句来检查目标表中的表行数以及BCP的执行情况来很容易地确认这一点。
从TEST_TABLE WITH (NOLOCK)中选择COUNT(*)
由于BCP是在一个有索引的表中大量插入5000万行,所以完成它肯定需要很长的时间。根据他发出筛选后的SELECT语句的确切时间点,他有可能检索他希望看到的数据行。但是,当他关闭运行BCP的命令提示符窗口时,回滚就开始了,当回滚完成时,这些数据行就会消失。因为他需要的数据行已经转移到另一个表中,所以他不会知道在幕后发生了什么。
https://dba.stackexchange.com/questions/174201
复制相似问题