sqlserver, как сделать вставку, но если она существует, обновите вместо маневра? - PullRequest
1 голос
/ 08 февраля 2011

Прочитайте несколько вещей онлайн и здесь, но сейчас я в замешательстве.То, что я хочу сделать, это простая вставка ... но если запись уже существует, я хочу обновить ее, как это лучше всего сделать в ms sqlserver?

Вот простой пример вставки:

INSERT INTO AdvertiserCategoryJoin
                  (AdvertiserID, CategoryID)
VALUES     (502910, 2)

Я пытался использовать ON DUPLICATE KEY, но у sqlserver нет аналога, что раздражало, так как лучше всего это сделать?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2011

Если у вас есть версия SQL2008, для этого есть очень хорошее утверждение. MERGE

MERGE AdvertiserCategoryJoin AS target
USING (SELECT @AdvertiserID, @CategoryID) AS source (AdvertiserID, CategoryID)
ON (target.AdvertiserID = source.AdvertiserID)
WHEN MATCHED THEN 
    UPDATE SET CategoryID = source.CategoryID
WHEN NOT MATCHED THEN   
    INSERT (AdvertiserID, CategoryID)
    VALUES (source.AdvertiserID, source.CategoryID)
    OUTPUT deleted.*, $action, inserted.* INTO #MyTempTable;
0 голосов
/ 08 февраля 2011

Вы всегда можете использовать условия IF..ELSE.

IF (SELECT COUNT(*) FROM AdvertiserCategoryJoin WITH(NOLOCK) WHERE AdvertiserID = 502910) = 1 BEGIN
UPDATE AdvertiserCategoryJoin
SET CategoryID = 2
WHERE AdvertiserID = 502910
END ELSE BEGIN
INSERT INTO AdvertiserCategoryJoin
                  (AdvertiserID, CategoryID)
VALUES     (502910, 2)
END

Но есть и другие способы сделать это, используя EXCEPT или EXISTS. Это действительно ваше дело, и то, что вы находите легче написать / поддерживать, и, как всегда, если вы используете SQL 2008 и готовы принять вызов, вы можете использовать команду MERGE , которая делает именно то, что хочу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...