テクニカル雑記帳です
作成した文字列で他のSPを呼び出す
例:以下のようなSPがあるとして
ストアドプロシージャ名 |
---|
Main_SP.StoerdProcedur |
19_SP.StoerdProcedure |
17_SP.StoerdProcedure |
18_SP.StoerdProcedure |
年度ごとに微妙に異なるストアドを呼び出さなくてはいけない場合、既存システムではメインSP内で年度をずら~~~っとif文で分岐させていた。(悪しき文化かと思うの。)
ここでは[Main_SP]から受け取ったパラメータ[@年度]を受けとりさえすれば、分岐を作らずに対応する各年度のSPを呼び出せるようにした。
名前の組み立て
年度はint型で入ってくるのでnvarchar型にconvertします
-- 年度をnvarchar型にします
convert(nvarchar,@年度) as 年度
必要な文字列を抜き出します
-- 右から2文字をconvertした年度から抜き出します
right(convert(nvarchar,@年度),2) as 下2桁
SP名を組み立てます
[dbo].[' + right(convert(nvarchar,@年度),2) + '_SP]' as SP名
メインのSPからの呼び出し
CREATE PROCEDURE [dbo].[Main_SP]
-- 受け取るパラメータを宣言
@対象年度 int = NULL
,@従業員ID int
AS
BEGIN
SET NOCOUNT ON;
BEGIN
IF @対象年度 IS NOT NULL
BEGIN
-- 先ほどの組み立てをここで利用
-- [dbo].[年度下2桁_SP]が呼び出される
DECLARE @module_name nvarchar(50) = '[dbo].[' + right(convert(nvarchar,@対象年度),2) + '_SP]'
EXEC @return_value = @module_name -- 呼び出しSP名を指定
@対象年度 = @対象年度,
@従業員ID = @従業員ID
return;
END
END
-- 必要に応じてエラー処理を入れるなど・・・ --
END
DB名も同様に組み立てて作成できる。
例:以下のようなDBがあるとして
DB名 |
---|
19_年度DB |
17_年度DB |
18_年度DB |
DECLARE @module_name nvarchar(50) = '[' + right(convert(nvarchar,@対象年度),2) + '_年度DB].[dbo].[' + right(convert(nvarchar,@対象年度),2) + '_SP]'
※注意
以下のように、パラメータにパラメータをそのまま突っ込むということをしているけど、これがいいことか悪いことかよく分かっていない。
パラメータを上書きするのは厳禁ということは知っているけども・・・・・・現場ルールに従ってくださいって感じ。
EXEC @return_value hogeSP
@対象年度 = @対象年度
@従業員ID = @従業員ID
return;