sql >> Database >  >> RDS >> Sqlserver

VOEG WAARDEN IN WAAR NIET BESTAAT

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



  1. Hoe gebruik ik ROW_NUMBER()?

  2. Krijg een lijst van alle tabellen in Oracle?

  3. Stap voor stap R12.2.6 EBS-installatie op Virtual Box

  4. Hoe een onbeperkt aantal tekens opslaan in Oracle 11g?