sqlserver如何做插入,但如果它存在更新而不是机动?

时间:2011-02-08 02:11:07

标签: sql-server visual-studio-2008

在线阅读一些内容,但现在感到困惑。我想要做的是一个简单的插入......但如果记录已经存在,我想更新它,如何在ms sqlserver中实现最佳效果?

以下是插入的简单示例:

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

我试图使用ON DUPLICATE KEY但sqlserver没有等效的,这很烦人,所以最好的方法是什么?

2 个答案:

答案 0 :(得分:0)

您始终可以使用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命令,它可以完全按照您的意愿执行操作。

答案 1 :(得分:0)

假设你有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;