【IT168技术文档】
由于在vod系统中需要对频道的点播进行统计,需要在sqlserver中作能返回结果集的存储过程。
在这当中,用到了在频道的下一层有节目的目录,节目也有可能有下一级目录,总体上说是一个目录树的结构(频道总是是目录树中的第一级目录)。vod中的节目就属于目录树中的一个目录。
在这个存储过程中,具体的思路如下:
1。通过节目表和节目日志表的关联,可以得到节目所属的目录和这个所属目录的访问次数。
2。建立临时表来存储统计的结果集。在临时表中建立频道的记录,有频道ID,频道名称,点播次数这三个字段。
3。对应1中的每一条记录,由目录id得到目录所属的频道号(这里我也做了一个存储过程),更新频道对应的点播次数。(即在原有的基础上加上点播次数)
4。从临时表中将记录查出,作为存储过程的返回值。
存储过程的代码如下:
CREATE PROCEDURE ChannelStatisticsMonth @startTime varchar(40) AS declare @directotyid int declare @dirName varchar(40) declare @orderFre int declare @statusFlag int CREATE TABLE #ChannelStatistics( directoryID INT PRIMARY KEY,dirname varchar(40),orderFrequency Numeric(18,0) ) insert into #ChannelStatistics select directoryid,dirname,0 as orderFrequency from directory where parentid=0 insert into #ChannelStatistics values (0,'根目录',0) DECLARE statistics_cursor CURSOR FOR select p.dirid as tempid,count(*) as count from programinfo p,worklog w where w.programid=p.programid and left(w.starttime,7) = @startTime group by p.dirid OPEN statistics_cursor declare @tempID int declare @count int FETCH NEXT FROM statistics_cursor INTO @tempID,@count SET @statusFlag= @@FETCH_STATUS EXECUTE dirFinalParentID @tempID,@finalID = @directotyid OUTPUT if @directotyid=0 update #ChannelStatistics set orderFrequency=orderFrequency+@count where directoryid=@tempID else update #ChannelStatistics set orderFrequency=orderFrequency+@count where directoryid=@directotyid WHILE @statusFlag = 0 BEGIN FETCH NEXT FROM statistics_cursor INTO @tempID,@count SET @statusFlag= @@FETCH_STATUS EXECUTE dirFinalParentID @tempID,@finalID = @directotyid OUTPUT if @directotyid=0 update #ChannelStatistics set orderFrequency=orderFrequency+@count where directoryid=@tempID else update #ChannelStatistics set orderFrequency=orderFrequency+@count where directoryid=@directotyid set @tempID=0 set @count=0 END CLOSE statistics_cursor DEALLOCATE statistics_cursor select * from #ChannelStatistics where directoryid<>0 GO 由目录id得到目录所属的频道号的存储过程如下: CREATE PROCEDURE dirFinalParentID @dirID int,@finalID int output AS BEGIN DECLARE @parentID int DECLARE finalParentID_cursor CURSOR FOR select parentid from directory where directoryid=@dirID OPEN finalParentID_cursor FETCH NEXT FROM finalParentID_cursor INTO @parentID CLOSE finalParentID_cursor DEALLOCATE finalParentID_cursor declare @finalParentID int SET @finalParentID= @parentID WHILE (@parentID > 0) BEGIN SET @finalParentID= @parentID EXECUTE dirFinalParentID @parentID,@finalID=@parentID OUTPUT END SET @finalID=@finalParentID END GO