Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

ВЪВЕТЕ СТОЙНОСТИ, КЪДЕТО НЕ СЪЩЕСТВУВА

Можете да направите това с помощта на IF изявление:

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

Можете да го направите без IF с помощта на SELECT

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

И двата метода са податливи на състояние на състезание, така че въпреки че все пак бих използвал един от горните за вмъкване, но можете да защитите дублиращи се вложки с уникално ограничение:

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

Пример за SQL-Fiddle

ДОБАВКА

В SQL Server 2008 или по-нова версия можете да използвате MERGE с HOLDLOCK за премахване на шанса за състояние на състезание (което все още не е заместител на уникално ограничение).

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

Пример за обединяване на SQL Fiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Внедряване на пълнотекстово търсене в SQL Server 2016 за напреднали потребители

  2. Преобразувайте името на месеца в номера на месеца в SQL Server (T-SQL)

  3. Запитване на SQL Server:Бързо с буквално, но бавно с променлива

  4. Архивиране на SQL Server 2017 -2

  5. Примери за SQL Server ЗА JSON ПЪТ (T-SQL)