2009-08-14 26 views
1

我有一个更新的经典案例或将一些数据插入到表中。我不确定是否应该只执行UPDATE,如果我得到零ROWCOUNT,那么请执行INSERT。另外,我听说有传言说MERGE声明现在取代了这一点,但在这种情况下,我不确定如何以及是否合适。Sql2008 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 

想法?

回答

1

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

  • 目标表更新
  • 源表从
  • 读JOIN条件
  • 一堆语句来执行的匹配或不匹配的行。

因此,它基本上看起来是这样的:

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语句中。

+0

马克,可以用我的例子SQLü编辑您的回复? – 2009-08-14 13:58:12

+0

@Marc,所以你不能有一个目标表和源表是相同的东西? – 2009-08-14 14:05:02

+0

不行 - 这不行。您需要拥有包含所有数据的实际表格,然后您需要一张表格,其中应用了更改 – 2009-08-14 14:06:59

相关问题