2010-08-16 35 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 

此查询有局限性,它不处理的情况下>或<是在文本,但如果需要,这可以围绕编码。

相关问题