2010-08-16 69 views
6

我有反饋面板,用戶可以使用AJAX HTMLEditor如何保存HTML數據在SQL服務器

我想保存在SQL服務器這個HTML數據寫入HTML格式化反饋

HTML源

This is <span style="font-weight: bold; ">nice</span> question 

HTML OUTPUT

This is nice question 

現在我怎麼能搜索到我的數據庫,如果你發現「很好」,那麼我的查詢無法響應是很好的,因爲數據庫也包含HTML標籤。

那麼什麼是使用SQL查詢& ASP.net保存和檢索HTML數據的最佳實踐。

回答

4

您可能會在SQL Server的全文搜索功能中獲得一些里程碑。這裏是介紹了全文檢索適用於存儲在SQL Server HTML文本的戰略資源:

http://www.developmentnow.com/blog/SQL+Server+2005+Full+Text+Search+On+HTML+Documents.aspx

+0

以上給出的鏈接有不同的選項,並且所有的都有顛倒/下跌 那麼什麼是最好的最終和最好的方法 – 2010-08-16 05:12:40

+1

@SOF:這是一個公平的問題。恐怕您必須權衡您的特定情況下的優缺點,以決定此實施是否合理。我相信是的。 「LIKE」條款非常有限,因爲您的問題如此雄辯。仔細實施的全文索引可能並不完美,但它擴展了超越簡單索引和查詢所能實現的範圍。 – kbrimington 2010-08-16 05:33:18

2

如果你使用SQL Server 2008則全文索引是一個不錯的選擇。將您的HTML存儲在varbinary(max)列中,並將其關聯文件類型設置爲文件類型列中的「.html」。全文索引器會將數據解析爲HTML,並只搜索文本內容而忽略HTML標籤。

+0

不錯..但GoDady爲我們提供了SQL SERVER 2005 – 2010-08-16 05:22:46

+0

@SOF用戶:全文索引位於SQL Server 2000和SQL Server 2005中 – gbn 2010-08-16 06:26:52

+0

不確定SQL Server 2005是否具有用於全文索引的HTML過濾器,可能只是2008事情。 – 2010-08-16 07:26:44

0

將數據兩次存儲在兩個不同的列中;一次是HTML,另一次只是純文本。從HTML列執行顯示,並對文本列執行任何搜索。

+0

它有趣的答案,這已經是我的最後一個選擇:) 但我不想重複數據。 – 2010-08-16 06:02:30

0

另一個答案是在執行搜索之前使用CTE去除HTML。

下面的CTE提取可能滿足搜索條件的行並遞歸地去掉HTML。查詢然後使用CTE的結果過濾掉仍包含HTML的行和不完全匹配搜索條件的行。

CTE並不像看起來那麼複雜。大多數小提琴演奏的是應對PATINDEX返回0

--** Test table 
DECLARE @HTML TABLE (id INT IDENTITY, html VARCHAR(max)) 
INSERT INTO @HTML SELECT 'This is a <span style="font-weight: bold; ">nice</span> question'; 
INSERT INTO @HTML SELECT 'The cat sat <span style="font-weight: bold; ">on the</span> mat'; 

--** Search criteria 
DECLARE @Search VARCHAR(50) = 'is a nice'; 

--** CTE to return the matching rows ignoring the HTML 
;WITH Search_CTE (html_id, html_text) 
AS (
    SELECT h.id AS 'html_id' 
     , LEFT(h.html,REPLACE(PATINDEX('%<%',h.html)-1,-1,999999)) + SUBSTRING(h.html,CONVERT(INT,REPLACE(PATINDEX('%>%',h.html)+1,1,999999)),LEN(h.html)) AS 'html_text' 
     FROM @HTML AS h 
    WHERE h.html LIKE '%' + REPLACE(@Search,' ','%') + '%' 
    UNION ALL 
    SELECT c.html_id AS 'html_id' 
     , LEFT(c.html_text,REPLACE(PATINDEX('%<%',c.html_text)-1,-1,999999)) + SUBSTRING(c.html_text,CONVERT(INT,REPLACE(PATINDEX('%>%',c.html_text)+1,1,999999)),LEN(c.html_text)) AS 'html_text' 
     FROM Search_CTE AS c 
    WHERE PATINDEX('%<%',c.html_text) > 0 
) 
SELECT h.html AS 'Original HTML' 
    , cte.html_text AS 'HTML Text' 
    FROM Search_CTE AS cte 
    JOIN @HTML AS h 
    ON h.id = cte.html_id 
WHERE PATINDEX('%<%',cte.html_text) = 0 --** Filter out rows still containing HTML 
    AND html_text LIKE '%' + @Search + '%'; --** Filter out rows not matching the search criteria 

此查詢有侷限性,它不處理的情況下>或<是在文本,但如果需要,這可以圍繞編碼。

相關問題