我一直用类似下面的东西来实现它:只有插入行,如果它尚不存在
INSERT INTO TheTable
SELECT
@primaryKey,
@value1,
@value2
WHERE
NOT EXISTS
(SELECT
NULL
FROM
TheTable
WHERE
PrimaryKey = @primaryKey)
...但一旦负载下,发生了主键冲突。这是根本插入这张表的唯一声明。那么这是否意味着上述说法不是原子的?
问题是,这几乎不可能随意重新创建。
也许我可以将其更改为类似以下内容:
INSERT INTO TheTable
WITH
(HOLDLOCK,
UPDLOCK,
ROWLOCK)
SELECT
@primaryKey,
@value1,
@value2
WHERE
NOT EXISTS
(SELECT
NULL
FROM
TheTable
WITH
(HOLDLOCK,
UPDLOCK,
ROWLOCK)
WHERE
PrimaryKey = @primaryKey)
虽然,也许我用错了锁或使用太多的锁什么的。我只是在一个单一的SQL语句(也许是不正确的)的假设下,如果我的答案是“IF(SELECT COUNT(*)... INSERT”将原子。
没有人有任何想法?
您是否尝试过使用没有'WHEN MATCHED'子句的合并? – 2010-08-04 16:59:18
你在什么版本的SQL Server? – 2010-08-04 16:59:21
这取决于客户端。包括2000和2008 R2之间的任何内容。虽然我们可能在声明最初编写时已经有7次了! – Adam 2010-08-04 17:20:00