------------------------------------
--用途:傳回給定類别id的樹路徑[取其名稱]
--說明:父節點與子節點路徑以>>聯結,改為自定義後使用該函數
--時間:2011-1-13 16:40:28
------------------------------------
CREATE FUNCTION Getpath
(@id INT)
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE
@re_str AS VARCHAR(1000)
SET @re_str = ''
SELECT @re_str = classname
FROM uds_class
WHERE classid = @id
WHILE EXISTS (SELECT 1
FROM uds_class
WHERE classid = @id
AND classparentid <> classid)
BEGIN
SELECT @id = b.classid,
@re_str = b.classname + '>>' + @re_str
FROM uds_class a,
uds_class b
WHERE a.classid = @id
AND a.classparentid = b.classid
END
RETURN @re_str
END
------------------------------------
--用途:傳回目前文檔多個關鍵詞構造的參照表@tb
--說明:原始關鍵詞以空格分割,改為自定義後使用該函數
--時間:2011-1-13 16:40:28
------------------------------------
CREATE FUNCTION GetRelaTag(@docid int)
RETURNS @tb table([name] varchar(20)) AS
begin
declare @index int
declare @name varchar(20),@tagstr varchar(500)
select @tagstr=tagnamestr from tss_document where [email protected]
if @tagstr<>'' set @[email protected]+space(1)
while(@tagstr<>'')
begin
set @index = charindex(space(1),@tagstr)
set @name = substring(@tagstr,1,@index-1)
set @tagstr = substring(@tagstr,@index+1,len(@tagstr)[email protected])
insert into @tb values(@name)
end
return
end
------------------------------------
--用途:獲得與目前資料相關的資源
--說明:關鍵詞改為自定義後使用該過程,用到自定義函數GetRelaTag
--時間:2011-1-13 16:40:28
------------------------------------
CREATE PROCEDURE usp_getrelakey3(
@docid INT,
@topN INT)
AS
SELECT IDENTITY(INT,1,1) as tid,* INTO #tmp FROM GetRelaTag(@docid)
DECLARE @relatable TABLE (
docid INT,
tagnamestr varchar(500))
DECLARE @resulttable TABLE (
docid INT,
score INT) --依據關鍵詞比對度加分
INSERT INTO @relatable SELECT docid,tagnamestr FROM tss_document
WHERE docid<>@docid and status='釋出' and tagnamestr is not null ORDER BY docid
DECLARE @min INT
SELECT @min = Min(docid) FROM @relatable
WHILE @min IS NOT NULL
BEGIN
BEGIN
DECLARE @mininner INT
SELECT @mininner = Min(tid) FROM #tmp
WHILE @mininner IS NOT NULL
BEGIN
IF EXISTS (SELECT * FROM #tmp WHERE [email protected] and [name] IN (SELECT * FROM GetRelaTag(@min)))
BEGIN
IF EXISTS (SELECT * FROM @resulttable WHERE docid = @min) --已存在則更新分數
UPDATE @resulttable SET score = Isnull(score,0) + 1 WHERE docid = @min
ELSE
INSERT INTO @resulttable VALUES(@min,1)
END
SELECT @mininner = Min(tid) FROM #tmp WHERE tid> @mininner
END
END
SELECT @min = Min(docid) FROM @relatable WHERE docid > @min --更新“指針”内容,使之移到下一記錄
END
SET ROWCOUNT @topN
SELECT b.*
FROM @resulttable a
LEFT JOIN tss_document b
ON a.docid = b.docid
WHERE b.status='釋出'
ORDER BY a.score DESC
GO
------------------------------------
--用途: 獲得給定類别id的所有父類包括其本身
--說明:注意自聯結的使用
--時間:2011-1-13 16:40:28
------------------------------------
CREATE FUNCTION getallparentInfor
(@id INT)
RETURNS @t TABLE(classid INT,className varchar(300))
AS
BEGIN
declare @CName as varchar(300)
select top 1 @CName=className from uds_class where [email protected]
INSERT INTO @t
VALUES (@id,@CName)
WHILE EXISTS (SELECT 1
FROM uds_class
WHERE classid = @id
AND classparentid <> classid)
BEGIN
SELECT @id = b.classid,@CName=b.className
FROM uds_class a,
uds_class b
WHERE a.classid = @id
AND a.classparentid = b.classid
INSERT INTO @t
VALUES (@id,@CName)
END
RETURN
END
------------------------------------
--用途: 獲得給定類别id的所有子類但不包括其本身
--時間:2011-1-13 16:40:28
------------------------------------
create function GetChildren (@id int)
returns @t table(classid int)
as
begin
insert @t select classid from uds_class where classparentid = @id
while @@rowcount > 0
insert @t select a.ClassID from uds_class as a inner join @t as b
on a.classparentid = b.classid and a.ClassID not in(select classid from @t)
return
end
------------------------------------
--用途: 獲得給定類别id的所有子類包括其本身
--說明:用到GetChildren 函數
--時間:2011-1-13 16:40:28
------------------------------------
CREATE function GetChildrenIncSelf(@ClassID int)
Returns table
AS
Return (select * from GetChildren(@ClassID)
union
select @ClassID ) --包含本身的類别id表