Ich hatte immer etwas Ähnliches verwendet, um dies zu erreichen:
INSERT INTO TheTable
SELECT
@primaryKey,
@value1,
@value2
WHERE
NOT EXISTS
(SELECT
NULL
FROM
TheTable
WHERE
PrimaryKey = @primaryKey)
... aber einmal unter Last ist eine Primärschlüsselverletzung aufgetreten. Dies ist die einzige Anweisung, die überhaupt in diese Tabelle eingefügt wird. Bedeutet dies also, dass die obige Aussage nicht atomar ist?
Das Problem ist, dass es fast unmöglich ist, dies nach Belieben wiederherzustellen.
Vielleicht könnte ich es wie folgt ändern:
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)
Obwohl ich vielleicht die falschen Schlösser benutze oder zu viele Schlösser oder so.
Ich habe andere Fragen auf stackoverflow.com gesehen, bei denen die Antworten ein "IF (SELECT COUNT (*) ... INSERT" usw.) vorschlagen, aber ich war immer unter der (möglicherweise falschen) Annahme, dass eine einzelne SQL-Anweisung atomar sein würde.
Hat jemand irgendwelche Ideen?
WHEN MATCHED
Klausel zu verwenden?