2016-05-31 28 views
0

回答が見つからないMERGE構文について質問があります。MERGE構文SQL Server 2012エラー

私は、次の場合持って

ステップ1:

create temp table #TempTbl 

ステップ2:MERGE

MERGE INTO T1 target 
USING T2 AS source ON (bunch of columns) 

WHEN MATCHED 
    UPDATE 
     SET some columns from target equal some columns from source 

WHEN NOT MATCHED BY TARGET 
    THEN INSERT (bunch of columns) 
     VALUES (bunch of columns from SOURCE) 

OUTPUT $action, deleted.* into #TempTbl 

私が知る必要がある何が私の上記の手順のためである私は見つけられないでしょう私の一時テーブルの空のデータ#TempTbl、私はWHEN NOT MATCHED ... THEN INSERTと書かれていますが、DELETEではありませんか?

2番目の質問、私はエラーメッセージを抱えていると、列の種類は、可能$actionべき:私はきたものの

列名または指定された値は、テーブル定義に

と一致しません私のテーブルから最初の列を定義しようとしましたvarchar(100)nvarchar(100)、運がありません。しかし、$actionフィールドを省略すると、私の声明が機能します。

+0

'@のaction'は#のTempTbl''であなたの最初の列と同じデータ型でなければなりません。 '削除されたものから何かを保存するには、何かを削除する必要があります - 'ソースと一致しないときは削除する ' – gofr1

+0

@BogdanM変更された値や挿入された値を保存しますか? – jpw

+0

[OK]をクリックします。私が書いたように、私はすでにそれを試しましたが、運がありません。 – BogdanM

答えて

5

したがって、$アクションを保持する列はnvarchar(10)である必要があります。

次の文は、insertupdateの両方のために一時テーブルに行を追加する(アップデートは本当に続く挿入、削除されたように)が、異なるアクションとなります

-- sample test data 
create table t1 (col1 int, col2 int) 
create table t2 (col1 int, col2 int) 
insert t1 values (1,1),(2,1) 
insert t2 values (2,2),(3,3) 
create table #temptbl (dml_action nvarchar(10), col1 int, col2 int) 

-- merge statement 
merge into t1 target 
using t2 as source 
    on target.col1 = source.col1 
when matched 
    then update set target.col2 = source.col2 
when not matched by target 
    then insert (col1, col2) values (source.col2, source.col2) 
output $action, inserted.col1, inserted.col2 into #temptbl ; 

-- sample result 

select * from #temptbl 

dml_action col1  col2 
---------- ----------- ----------- 
INSERT  3   3 
UPDATE  2   2 

したくない場合あなたがそうのような別の文にバッチ全体を包むことができupdate行:

insert #temptbl (dml_action, col1, col2) 
select dml_action, col1, col2 
from 
(
    merge into t1 target 
    using t2 as source 
    on target.col1 = source.col1 
    when matched 
     then update set target.col2 = source.col2 
    when not matched by target 
     then insert (col1, col2) values (source.col2, source.col2) 
    output $action as dml_action, inserted.col1, inserted.col2 
) a 
where a.dml_action = 'INSERT' 
+2

多くの、多くのありがとうございます。最高の一日を過ごしてください:)。よろしく、 – BogdanM

関連する問題