Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

WERTE EINFÜGEN, WO NICHT VORHANDEN

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