MS SQL Server 2012 — вставка значений, если строка не существует

Я новичок в SQL, и мне нужно проверить, существуют ли значения в строке, прежде чем я их вставлю.

Я пытаюсь вставить данные сразу в несколько строк.

Код у меня следующий:

insert into [Test].[Projects]([TestID], [GroupID], [TestingID], [Grade])
values 
    (314, 9, 77, 2)
    ,(314, 9, 77, 3)
    ,(314, 9, 77, 4)
    ,(329, 2, 65, 2)
    ,(329, 2, 65, 3)
    ,(329, 2, 65, 4)
go

Если бы кто-то мог помочь мне вставить их там, где значения строки не существуют, я был бы очень признателен.


person dori2o    schedule 23.04.2020    source источник


Ответы (1)


Вы можете использовать синтаксис insert ... select с условием not exists, которое гарантирует, что той же записи еще нет в таблице:

insert into Test.Projects(TestID, GroupID, TestingID, Grade)
select v.*
from (values 
    (314, 9, 77, 2), 
    (314, 9, 77, 3), 
    (314, 9, 77, 4), 
    (329, 2, 65, 2), 
    (329, 2, 65, 3), 
    (329, 2, 65, 4)
) v(TestID, GroupID, TestingID, Grade)
where not exists (
    select 1 
    from Test.Projects p
    where 
        p.TestID = v.TestID 
        and p.GroupID = v.GroupID 
        and p.TestingID = v.TestingID
        and p.Grade = v.Grade
)
person GMB    schedule 23.04.2020
comment
Хорошо, у меня это работает, но... Если бы TestID был переменной vTestID, можно ли было бы ввести эти значения для нескольких значений vTestID в рамках одного запуска скрипта? Так, например, если бы я хотел запустить код, в котором значения (314, 9, 77, 2) были там, где vTestID равен 101, затем значения (314, 9, 77, 3), где vTestID равен 102 и т. д. Вы смотрели таблицы значений, но не уверены, сработает ли это? В идеале я хотел бы установить все переменные сразу. Спасибо - person dori2o; 28.04.2020