Когато трябва да гарантирате уникалността на записите при условие, което не може да бъде изразено чрез ограничение UNIQUE или PRIMARY KEY, наистина трябва да се уверите, че проверката за съществуване и вмъкване се извършват в една транзакция. Можете да постигнете това чрез:
- Използване на един SQL израз за извършване на проверката и вмъкването (вашата трета опция)
- Използване на транзакция с подходящо ниво на изолация
Има обаче четвърти начин, който ще ви помогне по-добре да структурирате кода си и също така да го накарате да работи в ситуации, в които трябва да обработвате партида записи наведнъж. Можете да създадете променлива TABLE или временна таблица, да вмъкнете всички записи, които трябва да бъдат вмъкнати там, и след това да напишете изразите INSERT, UPDATE и DELETE въз основа на тази променлива.
По-долу е (псевдо)код, демонстриращ този подход:
-- Logic to create the data to be inserted if necessary
DECLARE @toInsert TABLE (idCol INT PRIMARY KEY,dataCol VARCHAR(MAX))
INSERT INTO @toInsert (idCol,dataCol) VALUES (1,'row 1'),(2,'row 2'),(3,'row 3')
-- Logic to insert the data
INSERT INTO realTable (idCol,dataCol)
SELECT TI.*
FROM @toInsert TI
WHERE NOT EXISTS (SELECT 1 FROM realTable RT WHERE RT.dataCol=TI.dataCol)
В много ситуации използвам този подход, тъй като прави TSQL кода по-лесен за четене, възможен за преструктуриране и прилагане на модулни тестове.