Sql2008 MERGE语法是我应该做的,在这里?

时间:2009-08-14 13:49:50

标签: sql-server-2008 merge

我有一个经典的UPDATE或将一些数据插入表中的情况。我不确定我是否应该做一个更新,如果我得到零ROWCOUNT,那么做一个INSERT。或者,我听说有传言说MERGE声明现在取代了这个,但我不确定在这种情况下如何以及是否合适。

这里有一些示例sql来帮助演示这个......

ALTER PROCEDURE [dbo].[InsertLocationName]
(
    @SomeId INTEGER,
    @SomeName NVARCHAR(100)
)
AS
BEGIN
    SET NOCOUNT ON

    UPDATE TableFoo
    SET SomeName = @SomeName
    WHERE SomeId = @SomeId

    -- Did we update something?
    IF @@ROWCOUNT <= 0
        -- Nope, so add the record.
        INSERT INTO TableFoo
        VALUES (@SomeName)

END

想法?

2 个答案:

答案 0 :(得分:1)

当然 - MERGE语法可能是最简单的。你基本上需要:

  • 要更新的目标表
  • 要从
  • 中读取的源表
  • 一个加入条件
  • 为匹配或不匹配的行执行的一堆语句。

所以它基本上看起来像这样:

MERGE TableFoo as t
USING TableFooSource as s
ON t.SomeID = s.SomeID
WHEN MATCHED THEN
  UPDATE SET t.SomeName = s.SomeName
WHEN NOT MATCHED THEN
  INSERT(SomeName) VALUES(s.SomeName)
;

最后不要忘记分号!!

马克

PS:已更新以使用您的表格和字段名称。这里的要点是 - 用于更新的数据集需要在其自己的源表中(如果需要,从例如外部文件批量导入),然后完成整个操作(所有INSERT和UPDATE)在一个SQL语句中。

答案 1 :(得分:0)