MERGE SQL Server Нарушение первичного ключа - PullRequest
0 голосов
/ 28 мая 2018

есть ли шанс, что я смогу успешно выполнить приведенный ниже SQL-оператор?В настоящее время я получаю Нарушение первичного ключа по моему запросу ниже.

То, что я хочу, это то, что, когда первая запись была вставлена ​​в целевую таблицу и если есть еще один первичный ключ, который будет вставлен, она должна выполнить UPDATE, а не INSERT, чтобы избежать нарушения первичного ключа,но я не знаю, чтобы написать это в реальном сценарии SQL.Насколько мне известно, у меня есть только следующий скрипт.

// User-Defined Tabled Type
DECLARE @tvpEmailType dbo.EmailType

INSERT @tvpEmailType VALUES ('mail@mail.com', 1)
INSERT @tvpEmailType VALUES ('mail@mail.com', 0)

MERGE dbo.EmailRepo AS TARGET
USING (SELECT DISTINCT * FROM @tvpEmailType) AS SOURCE
    ON (TARGET.Email = SOURCE.Email)
WHEN MATCHED AND TARGET.Status <> SOURCE.Status THEN
    UPDATE SET TARGET.Status = SOURCE.Status
WHEN NOT MATCHED THEN
    INSERT (Email, Status) VALUES (SOURCE.Email, SOURCE.Status);

1 Ответ

0 голосов
/ 28 мая 2018

Бинго

DECLARE @i table (iden int identity, email varchar(40), status bit);
DECLARE @t table (email varchar(40) primary key, status bit);

INSERT @i VALUES ('mail@mail.com', 1), ('mail@mail.com', 0)

MERGE @t AS TARGET
USING ( select email, status 
        from ( select email, status
                    , row_number() over (partition by email order by iden desc) as rn
                from @i
             ) t
             where t.rn = 1
      ) AS SOURCE
   ON TARGET.Email = SOURCE.Email
WHEN MATCHED THEN
    UPDATE SET TARGET.Status = SOURCE.Status
WHEN NOT MATCHED THEN
    INSERT (Email, Status) VALUES (SOURCE.Email, SOURCE.Status);

select * from @t
...