中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

SQL ServerのMerge構文でINSERTとUPDATEができる

SQL Server2008からMergeでInsertとUpdateを共通ロジックでできるようになりました。

declare @tab table
(
id int unique not null,
name nvarchar(4000)
)

insert into @tab values (1,'')
insert into @tab values (2,'')
insert into @tab values (3,'')
insert into @tab values (4,'')
insert into @tab values (5,'')
insert into @tab values (6,'')
insert into @tab values (7,'')
insert into @tab values (8,'')

こんなテスト用のテーブルに8っていうレコードを追加か更新します。

insert into @tab values(8,'a')

で、すでに8がある場合には更新失敗しますよね?

メッセージ 2627、レベル 14、状態 1、行 15
制約 'UQ__#68487DD__3213E83E6A30C649' の UNIQUE KEY 違反。オブジェクト 'dbo.@tab' には重複したキーを挿入できません。重複するキー値は (8) です。

で、この8って言うキーがある場合には、nameをupdateしたいんだって言う場合ありますよね。

たとえばー、ある機械の最新の情報を管理しているので、どんどんupdateする。でも新しい機械の場合には自動でレコードinsertして欲しいとか。

その場合SQLServer2005のBeginTryが使える場合には以下のような感じで実装します。(ほかにもトリガで解決したりします)

begin try
	insert into @tab values(8,'a')
end try
begin catch
	if @@ERROR = 2627 
	begin
		update @tab set name='a' where id=8
	end
	else
	begin
		RAISERROR (1,1,1)
	end
end catch

a まぁ8とか’a’が2カ所にあるとかは変数とかパラメーターで解決出来るとして、エラーを発生させてっていう手順はあまり美しくないですね。

merge into @tab as target
using(values (8,'a') )as source (id,name)
on target.id = source.id
when matched then 
	update set target.name = source.name
when not matched by target then
	insert values (id,name);
	

新しいMerge構文を使うとこのように書けます。

ちょっとややこしいので、絵を

image

mergeのusingで値を決めてそのあとの()で仮の変数名みたいに名前を付ける。

onで、対象のテーブルとマッチさせる(where)

when matched で、アップデート文のSet部分だけ

when not matchedでインサートのvaluesの部分だけ書く

構文が複雑で覚えられそうにありません。

まぁそれを理解するために書いたんですけどね。

投稿日時 : 2012年9月11日 23:54

コメントを追加

# common college application essay r30odo 2022/09/09 2:13 Charlosmox


With thanks, An abundance of facts!
https://definitionessays.com/ how to cite a website in an essay mla

# creating a thesis u37wxe 2023/02/09 3:13 Albertosed


Appreciate it. Lots of information!

https://service-essay.com/ paper writers

# What side effects can this medication cause? Get information now.
https://edonlinefast.com
Read now. Drug information. 2023/02/17 11:11 EdOnline

What side effects can this medication cause? Get information now.
https://edonlinefast.com
Read now. Drug information.

# where to buy papers e39wrg 2023/03/01 9:04 StevenGrelo


Really tons of awesome data.
graduate paper writing service https://service-essay.com/ psychology paper writing service

# thesis statement for a biography k598gt 2023/03/03 7:16 Josephbried


Perfectly voiced without a doubt! !
community service thesis statement https://writingthesistops.com/ buy master thesis

# academic writers online review g360zq 2023/03/06 17:56 Gregorysaipt


Well voiced without a doubt! !
dissertation doctoral https://paperwritingservicecheap.com writing assignment help https://helptowriteanessay.com

# i need help writing my essay p53ezd 2023/03/07 16:25 Gregorysaipt


Wow many of beneficial knowledge!
doctoral dissertation writing service https://customthesiswritingservice.com reasons for going to college essay https://dissertationwritingtops.com

# how to write an amazing essay f792mm 2023/03/07 19:13 EugeneSib


Truly plenty of useful info!
i need an essay written https://homeworkcourseworkhelps.com dissertation order https://topswritingservices.com

# thesis doctoral y73qle 2023/03/08 11:09 EugeneSib


Thanks, I appreciate it!
master thesis writing service https://cheapessaywriteronlineservices.com writing the college essay https://writingpaperforme.com

# college essay writing prompts t425hg 2023/03/08 14:43 Gregorysaipt


Great stuff. Many thanks.
computing dissertation https://writinganessaycollegeservice.com essay help websites https://customthesiswritingservice.com

# essay writing for kids p37omd 2023/03/09 12:37 Gregorysaipt


You said it perfectly..
professional cv writing service https://essaywritingservicetop.com how to write contrast essay https://service-essay.com

# how to begin college essay r81qta 2023/03/09 18:41 EugeneSib


Truly a lot of superb knowledge.
how to write an easy essay https://helptowriteanessay.com what to write in a college essay https://buyanessayscheaponline.com

# college essay coach p24qyq 2023/03/10 9:13 EugeneSib


Many thanks! I value it.
writing help for college students https://writingpaperforme.com it dissertation https://buycheapessaysonline.com

# ma dissertation y19jgh 2023/03/12 5:48 EugeneSib


Seriously all kinds of very good facts!
how to write short essay https://bestpaperwritingservice.com professional essay writing https://hireawriterforanessay.com

# proquest dissertation database t29ezw 2023/03/13 10:53 EugeneSib

You actually stated it effectively!
business letter writing services https://helpwithdissertationwriting.com doctoral theses https://helpmedomyxyzhomework.com

# sleep aids over the counter https://overthecounter.pro/# 2023/05/08 22:57 OtcJikoliuj

sleep aids over the counter https://overthecounter.pro/#

タイトル
名前
URL
コメント