在 Sql Server 2012 SP3 v.11.0.6020.0 (X64) 中,我有一个存储过程,它测试全局临时表(##MyTable
例如)的存在并创建它 - 当然如果没有找到。
IF OBJECT_ID ( 'tempdb..##MyTable' ) IS NULL
CREATE TABLE ##MyTable
(
Key1 smallint
, Key2 nvarchar(16)
, Value1 char(3)
);
在该过程的稍后部分,它会测试表是否有行,并在必要时填充它。
IF NOT EXISTS ( SELECT * FROM ##MyTable )
BEGIN
INSERT INTO ##MyTable
SELECT Key1, Key2, Value1
FROM SourceTable
WHERE ...
CREATE NONCLUSTERED INDEX IX_MyTable ON ##MyTable ( [Key1], [Key2] );
END
我确信 Key1 和 Key2 是唯一的,因为它们是源表上的主键。
然后,无论哪种情况(表已经存在或不存在),存储过程都会查询表。不用说,sp 逻辑比这复杂得多。
该表包含来自 7 个不同来源的客户数据;通常,插入近 100 万行需要几秒钟。从理论上讲,所有 INSERT INTO ##MyTable 都不可能插入 0(零)行。
存储过程由应用程序调用:该应用程序通常在早上启动并在晚上关闭。
从理论上讲,可能存在冲突,用户尝试插入数据并创建索引,而另一个用户已经在做同样的事情。但它不太可能总是发生在同一个用户身上。如果该用户在几分钟后再次尝试(表和索引已经存在),这应该是不可能的。
这对所有用户(接近 100 个)都适用,但对一个特定的用户来说,他会不断收到错误:The operation failed because an index or statistics with name 'IX_MyTable' already exists on table ##MyTable
.
除了我已经在考虑使全局临时表成为常规表这一事实之外,任何人都可以向我解释这种行为吗?
提前感谢任何会提供帮助的人!