U kunt dit doen met een IF
verklaring:
IF NOT EXISTS
( SELECT 1
FROM tblSoftwareTitles
WHERE Softwarename = @SoftwareName
AND SoftwareSystemType = @Softwaretype
)
BEGIN
INSERT tblSoftwareTitles (SoftwareName, SoftwareSystemType)
VALUES (@SoftwareName, @SoftwareType)
END;
Je zou het kunnen doen zonder IF
met behulp van SELECT
INSERT tblSoftwareTitles (SoftwareName, SoftwareSystemType)
SELECT @SoftwareName,@SoftwareType
WHERE NOT EXISTS
( SELECT 1
FROM tblSoftwareTitles
WHERE Softwarename = @SoftwareName
AND SoftwareSystemType = @Softwaretype
);
Beide methoden zijn vatbaar voor een race-conditie, dus hoewel ik nog steeds een van de bovenstaande zou gebruiken om in te voegen, maar je kunt dubbele invoegingen beveiligen met een unieke beperking:
CREATE UNIQUE NONCLUSTERED INDEX UQ_tblSoftwareTitles_Softwarename_SoftwareSystemType
ON tblSoftwareTitles (SoftwareName, SoftwareSystemType);
Voorbeeld op SQL-Fiddle
TOEVOEGEN
In SQL Server 2008 of later kunt u MERGE
. gebruiken met HOLDLOCK
om de kans op een race-conditie weg te nemen (die nog steeds geen vervanging is voor een unieke beperking).
MERGE tblSoftwareTitles WITH (HOLDLOCK) AS t
USING (VALUES (@SoftwareName, @SoftwareType)) AS s (SoftwareName, SoftwareSystemType)
ON s.Softwarename = t.SoftwareName
AND s.SoftwareSystemType = t.SoftwareSystemType
WHEN NOT MATCHED BY TARGET THEN
INSERT (SoftwareName, SoftwareSystemType)
VALUES (s.SoftwareName, s.SoftwareSystemType);
Voorbeeld van samenvoegen op SQL Fiddle