T-SQL:在第二个会话中填充表时查询表

时间:2017-07-10 13:46:17

标签: sql sql-server-2012 bulkinsert

有一张桌子:

CREATE TABLE T1 (
  id int NOT NULL PRIMARY KEY CLUSTERED
, some_column varchar(10)
, some_other_column datetime
, yet_another_one bigint
, bazillion_other_columns_goes_here ...
);

现在,在SSMS中我执行:

BULK INSERT T1 FROM 'E:\blahblahblah.dat';
blahblahblah.dat比较大; BULK INSERT需要40多分钟才能完成。

当BULK INSERT仍在运行时,我打开第二个会话到同一个server.database并继续:

SELECT * FROM T1;

正如预期的那样,输出中没有任何行。

然后我尝试:

SELECT * FROM T1 WITH(NOLOCK);

这次我得到了一整套导入的行,这也是预期的。

然而,当我跑步时:

SELECT id FROM t1 WITH(NOLOCK);

......我没有行。

如果我选择除id之外的任何列,我会得到部分结果。但是当我选择id ,我什么也得不到。除非BULK INSERT完成,一切都恢复正常。

为什么会发生这种情况?为什么SELECT *返回行而SELECT id没有?

1 个答案:

答案 0 :(得分:2)

  

为什么会发生这种情况?

因为你正在使用NOLOCK。所以你绝对不能保证得到什么。也许索引的非叶级别尚未建立。但谁知道呢。结果没有记录,可能随时改变。