Når du skal garantere entydigheden af poster på en betingelse, der ikke kan udtrykkes ved en UNIK eller PRIMÆR NØGLE-begrænsning, skal du virkelig sikre dig, at kontrollen for eksistens og indsættelse udføres i én transaktion. Du kan opnå dette ved enten:
- Brug af én SQL-sætning til at udføre kontrollen og indsættelsen (din tredje mulighed)
- Brug af en transaktion med det passende isolationsniveau
Der er dog en fjerde måde, der vil hjælpe dig med at strukturere din kode bedre og også få den til at fungere i situationer, hvor du skal behandle en batch af poster på én gang. Du kan oprette en TABLE-variabel eller en midlertidig tabel, indsætte alle de poster, der skal indsættes der, og derefter skrive INSERT-, UPDATE- og DELETE-sætningerne baseret på denne variabel.
Nedenfor er en (pseudo)kode, der demonstrerer denne tilgang:
-- 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)
I mange situationer bruger jeg denne tilgang, da den gør TSQL-koden nemmere at læse, mulig at omstrukturere og anvende enhedstest på.