我一直用類似下面的東西來實現它:只有插入行,如果它尚不存在
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