Siempre había usado algo similar al siguiente para lograrlo:insertar una fila si no está ya allí
INSERT INTO TheTable
SELECT
@primaryKey,
@value1,
@value2
WHERE
NOT EXISTS
(SELECT
NULL
FROM
TheTable
WHERE
PrimaryKey = @primaryKey)
... pero una vez bajo carga, se produjo una violación de clave principal. Esta es la única declaración que se inserta en esta tabla. Entonces, ¿esto significa que la declaración anterior no es atómica?
El problema es que esto es casi imposible de recrear a voluntad.
Tal vez podría cambiarlo al algo como lo siguiente:
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)
Aunque, tal vez estoy usando las cerraduras incorrecta o el uso excesivo de bloqueo o algo así.
He visto otras preguntas en stackoverflow.com donde las respuestas sugieren "IF (SELECT COUNT (*) ... INSERT", etc., pero siempre estuve bajo la suposición (tal vez incorrecta) de que una sola instrucción SQL sería atómica.
¿alguien tiene alguna idea?
¿Ha intentado usar una fusión sin una cláusula 'CUANDO ESTÁ ENCAMINADO'? –
¿En qué versión de SQL Server estás? –
Varía según el cliente. Cualquier cosa entre e incluyendo 2000 y 2008 R2. ¡Aunque pudimos haber estado en 7 cuando la declaración fue escrita originalmente! – Adam