sql >> Database teknologi >  >> RDS >> Sqlserver

INDSÆT VÆRDIER, HVOR IKKE FINNES

Du kan gøre dette ved at bruge en IF erklæring:

IF NOT EXISTS 
    (   SELECT  1
        FROM    tblSoftwareTitles 
        WHERE   Softwarename = @SoftwareName 
        AND     SoftwareSystemType = @Softwaretype
    )
    BEGIN
        INSERT tblSoftwareTitles (SoftwareName, SoftwareSystemType) 
        VALUES (@SoftwareName, @SoftwareType) 
    END;

Du kunne gøre det uden IF ved hjælp af SELECT

INSERT  tblSoftwareTitles (SoftwareName, SoftwareSystemType) 
SELECT  @SoftwareName,@SoftwareType
WHERE   NOT EXISTS 
        (   SELECT  1
            FROM    tblSoftwareTitles 
            WHERE   Softwarename = @SoftwareName 
            AND     SoftwareSystemType = @Softwaretype
        );

Begge metoder er modtagelige for en racetilstand, så selvom jeg stadig ville bruge en af ​​ovenstående til at indsætte, men du kan beskytte duplikerede indsatser med en unik begrænsning:

CREATE UNIQUE NONCLUSTERED INDEX UQ_tblSoftwareTitles_Softwarename_SoftwareSystemType
    ON tblSoftwareTitles (SoftwareName, SoftwareSystemType);

Eksempel på SQL-Fiddle

TILFØJELSE

I SQL Server 2008 eller nyere kan du bruge MERGE med HOLDLOCK for at fjerne chancen for en racetilstand (som stadig ikke er en erstatning for en unik begrænsning).

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);

Eksempel på Merge on SQL Fiddle



  1. MySQL:Opdel kommasepareret liste i flere rækker

  2. Hvordan forespørges feltet DATETIME kun ved hjælp af dato i Microsoft SQL Server?

  3. INDSÆT I ... VÆLG FRA ... PÅ DUBLIKAT NØGLEOPDATERING

  4. Flet to partitioner til én i SQL Server (T-SQL)