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

T-SQL: querying table while populating it in a second session

有个table:

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 仍在 运行ning 时,我打开第二个会话到同一个 server.database 然后去:

SELECT * FROM T1;

不出所料,我在输出中没有得到任何行。

那我试试:

SELECT * FROM T1 WITH(NOLOCK);

这次我得到了到目前为止导入的完整行集,也符合预期。

然而,当我运行:

SELECT id FROM t1 WITH(NOLOCK);

...我没有行。

如果我 select 除了 id 之外的任何列,我会得到部分结果。但是当我 select id only 时,我什么也得不到。当然,除非 BULK INSERT 完成并且一切恢复正常。

知道为什么会这样吗?为什么 SELECT * return 行而 SELECT id 没有?

Any ideas why this is happening?

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