Upsert из избранных - PullRequest
       8

Upsert из избранных

0 голосов
/ 04 июля 2018

Мне нужно выполнить upsert из выбора, например this , но в SQL Server. Я нашел кого-то, кто делает upsert в SQL Server здесь , но это не из избранных.

Мой запрос сейчас выглядит примерно так:

INSERT INTO (table1) (...)
    SELECT (...)
    FROM (table 2)
    WHERE X NOT IN (SELECT Y from (table1) WHERE Y IS NOT NULL)

Но я не могу понять, как добавить часть обновления. Я хотел бы добавить часть обновления, так как в 99% случаев это будет вставка.

Редактировать: этот код работал бы, если бы я мог сделать это с SELECT:

BEGIN TRY
    INSERT INTO table1 (id, name, itemname, itemcatName, itemQty)
    VALUES ('val1', 'val2', 'val3', 'val4', 'val5')
END TRY
BEGIN CATCH
    UPDATE table1 
    SET name = 'val2', 
        itemname = 'val3', 
        itemcatName = 'val4', 
        itemQty = 'val5'
    WHERE id = 'val1'
END CATCH

Ответы [ 4 ]

0 голосов
/ 04 июля 2018

Сначала обновите

update t1
SET (...)
FROM (table2) t2
JOIN table1 t1 WHERE t1.Y = t2.X


INSERT INTO (table1) (...)
SELECT (...)
FROM (table2) t2
WHERE NOT EXISTS (SELECT 1 from table1 WHERE Y = t2.X)
0 голосов
/ 04 июля 2018

update table1 
  set name = 'val2', itemname = 'val3', itemcatName = 'val4', itemQty = 'val5'
  where id = 'val1'

IF @@ROWCOUNT = 0
insert into table1(id, name, itemname, itemcatName, itemQty)
  values('val1', 'val2', 'val3', 'val4', 'val5')

У UPSERT: http://en.wikipedia.org/wiki/Upsert

0 голосов
/ 04 июля 2018

Если вы хотите INSERT, если запись не существует, или UPDATE, если она существует, попробуйте это

IF EXISTS (SELECT 1 FROM table1 WHERE somecol = @someval)
BEGIN
    UPDATE T1
    SET T1.someCol1 = T2.someCol1
        ,T1.someCol2 = T2.someCol2 
         --, etc,  etc
    FROM table1 T1
    INNER JOIN table2 T2 ON T1.Id = T2.T1_FK
END
ELSE
BEGIN
    INSERT INTO table1 (someCol, someCol2 --,etcetc)
    SELECT T2.someCol1, T2.someCol2 --etc etc
    FROM table2 T2
    WHERE somecol = @someval
END
0 голосов
/ 04 июля 2018

Вроде того же мышления, я думаю:

update t1
set ......
from table1 t1
inner join table2 on t1.Y=table2.X

Обратите внимание на обязательное использование псевдонима для обновленной таблицы для обновления на основе объединения.

Альтернативно, вы можете осмотреться (или дождаться ответа) для MERGE. Очень элегантно делать такие вещи, как упор с одним утверждением, но я так и не пришел к выводу, стоят ли возможные недостатки.

...