Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

INSERIR VALORES ONDE NÃO EXISTE


Você pode fazer isso usando um IF demonstração:
IF NOT EXISTS 
    (   SELECT  1
        FROM    tblSoftwareTitles 
        WHERE   Softwarename = @SoftwareName 
        AND     SoftwareSystemType = @Softwaretype
    )
    BEGIN
        INSERT tblSoftwareTitles (SoftwareName, SoftwareSystemType) 
        VALUES (@SoftwareName, @SoftwareType) 
    END;

Você poderia fazer isso sem IF usando SELECT
INSERT  tblSoftwareTitles (SoftwareName, SoftwareSystemType) 
SELECT  @SoftwareName,@SoftwareType
WHERE   NOT EXISTS 
        (   SELECT  1
            FROM    tblSoftwareTitles 
            WHERE   Softwarename = @SoftwareName 
            AND     SoftwareSystemType = @Softwaretype
        );

Ambos os métodos são suscetíveis a uma condição de corrida, portanto, embora eu ainda use um dos métodos acima para inserir, você pode proteger inserções duplicadas com uma restrição exclusiva:
CREATE UNIQUE NONCLUSTERED INDEX UQ_tblSoftwareTitles_Softwarename_SoftwareSystemType
    ON tblSoftwareTitles (SoftwareName, SoftwareSystemType);

Exemplo no SQL-Fiddle

ADENDO

No SQL Server 2008 ou posterior, você pode usar MERGE com HOLDLOCK para remover a chance de uma condição de corrida (que ainda não é um substituto para uma restrição única).
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);

Exemplo de mesclagem no SQL Fiddle