asp.net 相關文章實現方法第1/2頁
更新時間:2009年05月28日 21:37:37 作者:
大家或許會覺得很驚訝:為什么靈感之源會討論SQL?或許應該這樣說吧:搞業(yè)務系統(tǒng),不跟SQL扯上關系似乎比較難。
前言:大家或許會覺得很驚訝:為什么靈感之源會討論SQL?或許應該這樣說吧:搞業(yè)務系統(tǒng),不跟SQL扯上關系似乎比較難。
場景:在開發(fā)某系統(tǒng)的過程中,我遇到了要實現“相關文章”功能:任何文章都可以定義“關鍵字”,每篇文章依靠這個“關鍵字”來確定其它文章是否跟它相關,如果沒有定義關鍵字,則可能需要使用全文檢索來實現了,這是別的話題了。
思考:因為允許關鍵字可以通過“,”分隔符號來定義多個,所以加大了難度。經過思考,可以通過在保存文章的時候便分解關鍵字,建立一關鍵字表,把所有關鍵字逐個按對應的文章ID來保存。并決定采用純SQL存儲過程的辦法,因為這種重復的操作,與其用通用函數,倒不如用預編譯的存儲過程更加快,這樣能把所有處理都留給SQL Server。
解決方案1:首選要做的是在原有文章表(Details)的基礎上建立相關文章表(RelatedDetails),字段包括ItemID(主鍵)、DetailID(文章ID)和Keyword(關鍵字)。以下是主要存儲過程:
1、UpdateRelatedDetails:更新相關文章關鍵字
CREATE procedure dbo.UpdateRelatedDetails
@DetailID INT,
@Keywords NVARCHAR(500)
AS
EXEC DeleteRelatedDetails @DetailID
DECLARE @I INT
DECLARE @Keyword NVARCHAR(50)
SET @Keywords=REPLACE(@Keywords,',', ',')
SET @Keywords=REPLACE(@Keywords,';', ',')
SET @Keywords=RTRIM(LTRIM(@Keywords))
SET @I=CHARINDEX(',', @Keywords)
WHILE @I>=1
BEGIN
SET @Keyword=LEFT(@Keywords, @I-1)
INSERT INTO DetailKeywords (DetailID, Keyword) VALUES(@DetailID, @Keyword)
SET @Keywords=SUBSTRING(@Keywords, @I+1,LEN(@Keywords)-@I)
SET @I=CHARINDEX(',', @Keywords)
END
IF @Keywords<>''
INSERT INTO DetailKeywords (DetailID, Keyword) VALUES(@DetailID, @Keywords)
GO
2、DeleteRelatedDetails:刪除原有相關文章關鍵字
CREATE PROCEDURE dbo.DeleteRelatedDetails
@DetailID INT
AS
DELETE FROM DetailKeywords WHERE DetailID=@DetailID
GO
3、GetRelatedDetails:獲取相關文章,其中Details就是文章表
CREATE procedure dbo.GetRelatedDetails
@DetailID INT
AS
DECLARE @Keywords NVARCHAR(500)
SELECT @Keywords=Keywords FROM Details WHERE ItemID=@DetailID
IF @Keywords<>''
BEGIN
SELECT DISTINCT d.ItemID, d.Subject, d.ItemFile
FROM Details d RIGHT OUTER JOIN DetailKeywords k ON k.DetailID=d.ItemID WHERE d.ItemID <> @DetailID AND @Keywords LIKE '%'+k.Keyword+'%'
END
GO
場景:在開發(fā)某系統(tǒng)的過程中,我遇到了要實現“相關文章”功能:任何文章都可以定義“關鍵字”,每篇文章依靠這個“關鍵字”來確定其它文章是否跟它相關,如果沒有定義關鍵字,則可能需要使用全文檢索來實現了,這是別的話題了。
思考:因為允許關鍵字可以通過“,”分隔符號來定義多個,所以加大了難度。經過思考,可以通過在保存文章的時候便分解關鍵字,建立一關鍵字表,把所有關鍵字逐個按對應的文章ID來保存。并決定采用純SQL存儲過程的辦法,因為這種重復的操作,與其用通用函數,倒不如用預編譯的存儲過程更加快,這樣能把所有處理都留給SQL Server。
解決方案1:首選要做的是在原有文章表(Details)的基礎上建立相關文章表(RelatedDetails),字段包括ItemID(主鍵)、DetailID(文章ID)和Keyword(關鍵字)。以下是主要存儲過程:
1、UpdateRelatedDetails:更新相關文章關鍵字
復制代碼 代碼如下:
CREATE procedure dbo.UpdateRelatedDetails
@DetailID INT,
@Keywords NVARCHAR(500)
AS
EXEC DeleteRelatedDetails @DetailID
DECLARE @I INT
DECLARE @Keyword NVARCHAR(50)
SET @Keywords=REPLACE(@Keywords,',', ',')
SET @Keywords=REPLACE(@Keywords,';', ',')
SET @Keywords=RTRIM(LTRIM(@Keywords))
SET @I=CHARINDEX(',', @Keywords)
WHILE @I>=1
BEGIN
SET @Keyword=LEFT(@Keywords, @I-1)
INSERT INTO DetailKeywords (DetailID, Keyword) VALUES(@DetailID, @Keyword)
SET @Keywords=SUBSTRING(@Keywords, @I+1,LEN(@Keywords)-@I)
SET @I=CHARINDEX(',', @Keywords)
END
IF @Keywords<>''
INSERT INTO DetailKeywords (DetailID, Keyword) VALUES(@DetailID, @Keywords)
GO
2、DeleteRelatedDetails:刪除原有相關文章關鍵字
復制代碼 代碼如下:
CREATE PROCEDURE dbo.DeleteRelatedDetails
@DetailID INT
AS
DELETE FROM DetailKeywords WHERE DetailID=@DetailID
GO
3、GetRelatedDetails:獲取相關文章,其中Details就是文章表
復制代碼 代碼如下:
CREATE procedure dbo.GetRelatedDetails
@DetailID INT
AS
DECLARE @Keywords NVARCHAR(500)
SELECT @Keywords=Keywords FROM Details WHERE ItemID=@DetailID
IF @Keywords<>''
BEGIN
SELECT DISTINCT d.ItemID, d.Subject, d.ItemFile
FROM Details d RIGHT OUTER JOIN DetailKeywords k ON k.DetailID=d.ItemID WHERE d.ItemID <> @DetailID AND @Keywords LIKE '%'+k.Keyword+'%'
END
GO
相關文章
asp.net+sqlserver實現的簡單高效的權限設計示例
大部分系統(tǒng)都有權限系統(tǒng)。一般來說,它能管控人員對某個否頁面的訪問;對某些字段、控件可見或者不可見。對gridview中的數據是否可刪除、可添加、可新增等等。2010-04-04
.net 獲取瀏覽器Cookie(包括HttpOnly)實例分享
這篇文章介紹了.net 獲取瀏覽器Cookie(包括HttpOnly)實例,有需要的朋友可以參考一下2013-10-10
.NET 6.0 + WPF 使用 Prism 框架實現導航
Prism是一款專為XAML應用程序設計的開源框架,主要面向WPF和Xamarin Forms等平臺,文章介紹了Prism的基本概念、安裝步驟和使用方法,是開發(fā)企業(yè)級應用程序的首選框架,感興趣的朋友跟隨小編一起看看吧2024-09-09

