trapemiyaの日記

hatenablogが新しくなったんで新規一転また2019年1月からちょこちょこ書いてます。C#中心のプログラミングに関するお話です。

 ストアドプロシージャのメリットってなんだろう?

ストアドプロシージャって、プログラムでSQL文を直接書くことと比較して、実は次のようなメリットがあるんです。一般的なメリットは置いといて、あまり書かれていないことをご紹介します。

1. 一つのデータベースを、いろんな環境のアプリケーションが使用しており、共通の処理を行いたい場合。わかりにくいですよね。(^^; 具体例を挙げれば、SQL serverがあって、それをASP, ASP.NET, C#, VBなどのアプリが利用しているとします。そして、それぞれのアプリの実行時に、一定の条件を満たしている不要なレコードを削除するという処理を共通で行いたいとします。この時、いろんな言語でSQL文を組み立てて発行しますか? 作るのも大変ですが、削除の仕様が変わったときなどのメンテナンスも大変ですよね。そんな時に、ストアドプロシージャの出番。各環境のアプリケーションから、ストアドプロシージャを呼んでやればいいんです。ストアドプロシージャがサーバー側で実行されるというメリットを生かした、良い例ですね。
C#が、C#2.0になっても、VS2003がVS2005になっても、プログラムでSQLを組み立てて発行するわけじゃないから、簡単に移行できるはずです。ただ、ストアドプロシージャの呼び出し方法は変わるかもしれないですが。(^^;

2. ストアドプロシージャの中では自由にどんどんSQL文が書ける。って、これもわかりにくいですね。(^^; 具体例を挙げましょう。レコードを保存する時に、既に存在していれば更新し、存在していなければ新規に保存するという処理がよくあります。これをADO.NETで書こうと思うと、ちょっと面倒なんです。でも、ストアドプロシージャを使うと、以下のように意外に簡単に書けてしまいます。また、プログラムでSQL文で書くと、存在をチェックして、その後また保存か更新かのSQL文を投げなきゃなりません。つまり、クライアントからサーバーへ2往復しなきゃならないんですね。

Create Procedure usp_CT04_insertupdate
(
	@CT04KID           INT                     ,
	@CT04COMPDAYS      INT
)
as
DECLARE @LOCAL_CT04ID INT
SET @LOCAL_CT04ID = (select CT04ID from CT04 where CT04KID = @CT04KID)

IF @LOCAL_CT04ID IS NULL
	BEGIN
		insert into CT04
		(
			CT04KID           ,
			CT04COMPDAYS
		)
		values
		(
			@CT04KID          ,
			@CT04COMPDAYS
		)
	END
ELSE
	BEGIN
		update CT04 set
			CT04KID=@CT04KID,
			CT04COMPDAYS=@CT04COMPDAYS
		where
			CT04ID=@LOCAL_CT04ID
END

return