Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

INSÉRER LES VALEURS OÙ N'EXISTE PAS

Vous pouvez le faire en utilisant un IF déclaration :

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

Vous pourriez le faire sans IF en utilisant SELECT

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

Les deux méthodes sont sensibles à une condition de concurrence, donc même si j'utiliserais toujours l'une des méthodes ci-dessus pour insérer, vous pouvez protéger les insertions en double avec une contrainte unique :

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

Exemple sur SQL-Fiddle

ADDENDA

Dans SQL Server 2008 ou version ultérieure, vous pouvez utiliser MERGE avec HOLDLOCK pour supprimer le risque d'une condition de concurrence (qui ne remplace toujours pas une contrainte unique).

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

Exemple de fusion sur SQL Fiddle