私のデータベースには、次のような構造のテーブルがあります。
create table ItemNameSearches
(ItemName varchar(50) not null,timesSearched int not null,
primary key(ItemName))
and
create table ItemList
(ItemName varchar(50),
primary key (ItemName))
私の考えは、ウェブフォームを介してコンマ区切りの値のリストを入力して、特定のアイテムに関する情報を取得できるようにすることです。テーブル ItemList には、検索対象の項目に関する情報が含まれています (ただし、この例では、テーブル構造はそれを反映していません)。ただし、検索したアイテムが ItemList テーブルに表示されない場合は、その ItemName を ItemNameSearches に挿入して、人々が何を検索しているかをよりよく把握できるようにしたいと考えています。
シナリオ 1: アイテムが初めて検索され、新しい行が ItemNameSearches テーブルに挿入されます。これはトリガーの領域であると確信していますが、トリガーの使用に慣れていないため、次のストアド プロシージャを作成しました。
create proc spSearchItemName
@itemName1 varchar(50)
,@itemName2 varchar(50) = null
,@itemName3 varchar(50) = null
,@itemName4 varchar(50) = null
as
begin
;with searchList
as
(select x.itemName
from (values (@itemName1)
,(@itemName2)
,(@itemName3)
,(@itemName4)
) as x(itemName)
where x.itemName is not null
--these are optional parameters just to give the user more flexibility
--on if they want to look at multiple items at once or not
)
insert into ItemNameSearches(itemName,timesSearched)
values
(
(select sl.itemName
from searchList as sl
left outer join ItemList as il
on il.itemName=sl.itemName
where il.itemName is null
--this subquery finds the items searched for that are not present in the
--itemlist table and sets timesSearched =1 for each
),1
)
end
This is well and good for the items that are searched for that do not appear in the ItemList table, but I would have to do something like the following procedure if they DID search for an item that was in the ItemList table
;with searchList
as
(select x.itemName
from (values ('item 1')
,('item 2')
,('item 3')
,('item 5')
) as x(itemName)
)
update ins
set timesSearched = timesSearched +1
from ItemNameSearches as ins
where itemName in
(select itemName from searchList)
したがって、アイテムが ItemList テーブルに存在する場合、アイテムが検索された回数に 1 が追加されます。誰かがこれらの 2 つの異なる状況を解決するためのきちんとした方法を提供できますか? これはトリガーの良い候補ですか?