日期:2014-05-18 浏览次数:20698 次
ALTER PROC [dbo].[GetRelatedArticle]
@artID int,
@returnCount int
AS
declare @tags nvarchar(500),@keywords nvarchar(500),@keys nvarchar(500),@count int,@i int,@whereStr nvarchar(2000),@Sql nvarchar(2000),@Sql1 nvarchar(1000)
set @i=1
set @whereStr=''
select @tags=class_name2,@keywords=keywords,@keys=keys from article_table where id=@artID
if exists (select * from tempdb.dbo.sysobjects where id = object_id(N'tempdb..#aa') and type='U')
drop table #aa
//关键字是'|关键字1|关键字2|'这样格式的
//split是自己些的分割函数
select * into #aa from split(@keys,'|') where short_str<>''
insert into #aa select short_str from split(@keywords,',') where short_str<>''
insert into #aa select short_str from split(@tags,'|') where short_str<>''
delete a from #aa a where exists(select 1 from #aa where short_str=a.short_str and ID<a.ID)
select @count=COUNT(id) from #aa
if @count=0 and (@tags<>'' or @keywords<>'' or @keys<>'')
begin
if @keys<>''
insert into #aa values(REPLACE(@keys,'|',''))
else if @keywords<>''
insert into #aa values(REPLACE(@keywords,',',''))
else if @tags<>''
insert into #aa values(REPLACE(@tags,'|',''))
set @count=1
end
declare @class_name nvarchar(50),@TopCount int
select @class_name=class_name1 from article_table where id=@artID
set @TopCount=@returnCount
if exists (select * from tempdb.dbo.sysobjects where id = object_id(N'tempdb..#relatetable') and type='U')
drop table #relatetable
create table #relatetable(rid int identity (1,1),id int,class_name1 nvarchar(50),class_name2 nvarchar(200),head nvarchar(500),pic nvarchar(200),head_short nvarchar(50),rootpath nvarchar(50),class_root nvarchar(50))
while @i<=@count
begin
declare @tag nvarchar(50),@id int
declare @counttemp_b int
Select TOP 1 @tag=short_str,@id=id FROM #aa order by id
delete from #aa where ID=@id
if @id>52000 --因为以前的keys和tags差不多。所以没必要查询
begin
--先判断最相关在
set @whereStr='a.keys like ''%|'+REPLACE(@tag,'''','''''')+'|%'''
--执行
if @whereStr=''
begin
set @whereStr='1<>1'
end
set @sql='insert INTO #relatetable(id,class_name1,class_name2,head,pic,head_short,rootpath,class_root) select top '+STR(@TopCount)+' a.id,a.class_name1,a.class_name2,a.head,a.pic,a.head_short,a.rootpath,b.file_name from article_table a inner join class_table b on a.class_name1=b.class_name where ('+@whereStr+') and addtime<=GETDATE() and a.[ID]<>'+STR(@artID)+' and a.status=2 and b.parent_id=''|0|'' and a.id not in (select id from #relatetable) and uptime between dateadd(mm,-4,getDate()) and getDate() order by a.uptime desc'
EXEC SP_EXECUTESQL @Sql
select @counttemp_b=COUNT(id) from #relatetable
--查询是否已经查出国@returnCount条,如果是,则不需要再查
if @counttemp_b=@returnCount
begin
select * from #relatetable order by rid
return
end
else
begin
set @TopCount=@returnCount-@counttemp_b
end
end
set @whereStr='a.keywords like ''%'+REPLACE(@tag,'''','''''')+'%'' or a.head like ''%'+REPLACE(@tag,'''','''''')+'%'''
--执行
if @whereStr=''
begin
set @whereStr='1<>1'
end
set @sql='insert INTO #relatetable(id,class_name1,class_name2,head,pic,head_short,rootpath,class_root) select top '+STR(@TopCount)+' a.id,a.class_na