Sie könnten dies mit einem IF
tun Aussage:
IF NOT EXISTS
( SELECT 1
FROM tblSoftwareTitles
WHERE Softwarename = @SoftwareName
AND SoftwareSystemType = @Softwaretype
)
BEGIN
INSERT tblSoftwareTitles (SoftwareName, SoftwareSystemType)
VALUES (@SoftwareName, @SoftwareType)
END;
Sie könnten es auch ohne IF
machen mit SELECT
INSERT tblSoftwareTitles (SoftwareName, SoftwareSystemType)
SELECT @SoftwareName,@SoftwareType
WHERE NOT EXISTS
( SELECT 1
FROM tblSoftwareTitles
WHERE Softwarename = @SoftwareName
AND SoftwareSystemType = @Softwaretype
);
Beide Methoden sind anfällig für eine Race-Condition, also würde ich zwar immer noch eine der oben genannten zum Einfügen verwenden, aber Sie können doppelte Einfügungen mit einer Unique-Einschränkung schützen:
CREATE UNIQUE NONCLUSTERED INDEX UQ_tblSoftwareTitles_Softwarename_SoftwareSystemType
ON tblSoftwareTitles (SoftwareName, SoftwareSystemType);
Beispiel für SQL-Fiddle
NACHTRAG
In SQL Server 2008 oder höher können Sie MERGE
verwenden mit HOLDLOCK
um die Wahrscheinlichkeit einer Race-Condition zu beseitigen (was immer noch kein Ersatz für eine eindeutige Einschränkung ist).
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);
Beispiel für Merge auf SQL Fiddle