【问题标题】:T-SQL: querying table while populating it in a second sessionT-SQL:在第二个会话中填充表时查询表
【发布时间】:2017-07-10 13:46:17
【问题描述】:

有一张桌子:

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 only 时,我什么也得不到。当然,除非 BULK INSERT 完成并且一切恢复正常。

任何想法为什么会发生这种情况?为什么 SELECT * 返回行而 SELECT id 不返回?

【问题讨论】:

  • 确认一下,id 不是 IDENTITY 列?在区分大小写的排序规则中,表t1T1 不同
  • 确实不是身份,这都是同一张表。

标签: sql sql-server-2012 bulkinsert


【解决方案1】:

任何想法为什么会发生这种情况?

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

【讨论】:

    猜你喜欢
    • 2019-02-07
    • 1970-01-01
    • 2017-04-06
    • 2020-04-27
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 2021-08-20
    • 2018-08-21
    相关资源
    最近更新 更多