次のような構造のテーブルがあります
create table DrugInteractions
(ndc_fk varchar(50) not null
,ndc_pk varchar(50) not null
,InteractionSeverity int not null,
primary key(ndc_fk,ndc_pk)
)
のような構造を持つ別のもの
create table DrugList
(char(11) not null
,drug_name varchar(50) not null
,drug_class char(3) not null,
primary key(ndc)
)
と Drug_name には 1 対多の関係がありますが、drug_class
drug_name と Drug_class の間にはもちろん 1 対 1 の関係があります。現在、次のシナリオで DrugInteraction テーブルにレコードを追加する 3 つのストアド プロシージャがあります。
あるクラスのすべての薬物が別のクラスと相互作用する
CREATE proc spInsertDrugInteractionsByDrugClass
@referenceClass char(3)
,@interactingClass char(3)
as
begin
;with x
as
(
select distinct
drug_name
from DrugList
where drug_class =@interactingClass
)
,y
as
(
select drug_name
from Druglist
where drug_class = @referenceClass
)
insert into DrugInteractions(ndc_pk,ndc_fk)
select distinct
upper(x.drug_name)
,upper(y.drug_name)
from y,x
end
sproc からの出力例
ndc_fk ncd_pk
drug1 drug2
drug1 drug3
drug1 drug4
別の状況は、1 つの「参照」薬物クラスと、同じ drug_class である場合と異なる場合がある sproc へのパラメーターとして入力された他の薬物名がある場合です。
CREATE proc spInsertDrugInteractionsByClassAndName
@referenceClass char(3)
,@d1 varchar(50) = null
,@d2 varchar(50) = null
,@d3 varchar(50) = null
,@d4 varchar(50) = null
,@d5 varchar(50) = null
as begin
;with refClassDrugNames
as
(
select distinct upper(drug_name) as drug_name
from DrugList
where drug_class = @referenceClass
),
drugName
as
(
select distinct upper(drug_name) as drug_name
from DrugList
where drug_name in (@d1,@d2,@d3,@d4,@d5)
)
insert into DrugInteractions(ndc_pk,ndc_fk)
select * from refClassDrugNames,drugName
end
Sample output from this sproc would be:
ndc_pk ndc_fk
drug1 refDrug
drug2 refDrug
drug3 refDrug
drug4 refDrug
このような状況では、複数のストアド プロシージャを使用するのは良い設計ですか、それとも悪い設計ですか? 1 つの sproc でこれら 2 つのシナリオをカバーする方法が必要だと思わずにはいられません。これに似たことを SQL Server だけで行うことはできますか?