2009-08-14 40 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

相關問題