sql >> Databasteknik >  >> RDS >> Sqlserver

SÄTT IN VÄRDEN DÄR INTE FINNS

Du kan göra detta med en IF uttalande:

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

Du kan göra det utan IF med SELECT

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

Båda metoderna är mottagliga för ett rastillstånd, så även om jag fortfarande skulle använda en av ovanstående för att infoga, men du kan skydda dubbletter av inlägg med en unik begränsning:

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

Exempel på SQL-Fiddle

TILLÄGG

I SQL Server 2008 eller senare kan du använda MERGE med HOLDLOCK för att ta bort risken för ett lopptillstånd (vilket fortfarande inte är en ersättning för 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);

Exempel på Merge on SQL Fiddle



  1. Hur man använder LIKE i SQL

  2. Hur man ställer in fjärranslutning till PostgreSQL

  3. SQL Server Failover Cluster Installation -2

  4. Hur man använder GOTO i SQL Server