2009-08-14 18 views
1

私はテーブルにいくつかのデータをUPDATEまたはINSERTする古典的なケースがあります。私はちょうど私が更新を行う必要がありますし、私はゼロ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構文がおそらく最も簡単です。あなたは基本的に必要があります。

  • ターゲットテーブルは、結合条件
  • からマッチまたは非マッチした行に対して実行する文の束を読み取るために
  • にソーステーブルを更新します。

だから、基本的にこのようなものになります。

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)が完了している1つのSQLステートメントで実行します。ここでの説明の

+0

マルク、uは私の例のSQLを使用して返信を編集することができますか? –

+0

@Marcなので、ターゲットテーブルとソーステーブルを同じにすることはできません。 –

+0

nope - それは動作しません。あなたはあなたのすべてのデータを持っている実際のテーブルを持っている必要がありますし、変更を適用するテーブルが必要です –

関連する問題