[英]Solutions for tracking how many times certain parameters are used in a stored procedure SQL Server 2008
在我的數據庫中,表的結構類似於:
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))
我的想法是讓人們通過Web表單輸入逗號分隔的值列表,以便他們可以獲取有關某些項目的信息。 表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。 有人可以提供一種巧妙的方式來解決這兩種不同的情況嗎? 這是觸發器的理想選擇嗎?
感謝@Gordon Linoff提供了使用merge語句的指導,它最終完美地實現了我想做的事情。 我最終使用了以下存儲過程,並且運行良好。
alter proc spSearchDrugName
@drugName1 varchar(50)
,@drugName2 varchar(50) = null
,@drugName3 varchar(50) = null
,@drugName4 varchar(50) = null
,@drugName5 varchar(50) = null
as
begin
declare @searchList table(drugName varchar(50))
insert into @searchList
values (@drugName1)
,(@drugName2)
,(@drugName3)
,(@drugName4)
,(@drugName5)
merge DrugListSearches as d
using(select drugName from @searchList where drugName is not null) as s
on s.drugName = d.drugName
when matched then
update set d.timesSearched = d.timesSearched + 1
when not matched then
insert (drugname,timesSearched) values (s.drugName,1);
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.