簡體   English   中英

跟蹤存儲過程SQL Server 2008中使用某些參數的次數的解決方案

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM