Bạn có thể thực hiện việc này bằng cách sử dụng IF
tuyên bố:
IF NOT EXISTS
( SELECT 1
FROM tblSoftwareTitles
WHERE Softwarename = @SoftwareName
AND SoftwareSystemType = @Softwaretype
)
BEGIN
INSERT tblSoftwareTitles (SoftwareName, SoftwareSystemType)
VALUES (@SoftwareName, @SoftwareType)
END;
Bạn có thể làm điều đó mà không cần IF
sử dụng SELECT
INSERT tblSoftwareTitles (SoftwareName, SoftwareSystemType)
SELECT @SoftwareName,@SoftwareType
WHERE NOT EXISTS
( SELECT 1
FROM tblSoftwareTitles
WHERE Softwarename = @SoftwareName
AND SoftwareSystemType = @Softwaretype
);
Cả hai phương pháp đều dễ bị ảnh hưởng bởi điều kiện chủng tộc, vì vậy mặc dù tôi vẫn sẽ sử dụng một trong các phương pháp trên để chèn, nhưng bạn có thể bảo vệ các lần chèn trùng lặp bằng một ràng buộc duy nhất:
CREATE UNIQUE NONCLUSTERED INDEX UQ_tblSoftwareTitles_Softwarename_SoftwareSystemType
ON tblSoftwareTitles (SoftwareName, SoftwareSystemType);
Ví dụ trên SQL-Fiddle
BỔ SUNG
Trong SQL Server 2008 trở lên, bạn có thể sử dụng MERGE
với HOLDLOCK
để loại bỏ cơ hội của một điều kiện chủng tộc (vẫn không thể thay thế cho một ràng buộc duy nhất).
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);
Ví dụ về Hợp nhất trên SQL Fiddle