f:id:azix:20180413163155p:plain

例:以下のような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;