2010-08-16 186 views
6

tengo panel de retroalimentación donde el usuario puede escribir comentarios con formato HTML utilizando AJAX HTMLEditorCómo guardar los datos HTML en SQL Server

Quiero guardar estos datos HTML en el servidor SQL

fuente HTML

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

salida HTML

This is nice question 

Ahora, ¿cómo puedo buscar en mi base de datos si su búsqueda es "agradable", entonces mi consulta no puede responder porque la base de datos también contiene etiquetas HTML.

¿Cuáles son las mejores prácticas para guardar y recuperar datos HTML utilizando SQL Query & ASP.net.

Respuesta

4

Puede sacarle provecho a la capacidad de búsqueda de texto completo de SQL Server. Aquí es un recurso que describe las estrategias para aplicar búsqueda de texto completo al texto HTML almacenado en SQL Server:

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

+0

El enlace de arriba tiene diferentes opciones y todas tienen ventajas/inconvenientes así que cuál es el mejor método final y mejor –

+1

@SOF: Esa es una buena pregunta. Me temo que tendrá que sopesar las ventajas y desventajas en su escenario específico para decidir si esta implementación es razonable. Yo creo que es. Las cláusulas 'LIKE' son extremadamente limitadas, como su pregunta lo demuestra de manera elocuente. Un índice de texto completo cuidadosamente implementado puede no ser perfecto, pero extiende los límites más allá de lo que es posible con índices y consultas más simples. – kbrimington

2

Si está utilizando SQL Server 2008 y luego la indización de texto es una buena opción. Almacene su HTML en una columna varbinary (max) y establezca su tipo de archivo asociado a ".html" en una columna de tipo de archivo. El indexador de texto completo analizará los datos como HTML y buscará solo el contenido de texto sin tener en cuenta las etiquetas HTML.

+0

Niza ... Pero GoDady nos da SQL SERVER 2005 –

+0

@SOF Usuario: la indexación de texto completo está en SQL Server 2000 y SQL Server 2005 – gbn

+0

No estoy seguro si SQL Server 2005 tiene el filtro HTML para indexación de texto completo, podría ser solo un 2008 cosa. –

0

Almacene los datos dos veces en dos columnas diferentes; una vez como HTML y otra como texto simple. Haga la visualización desde la columna HTML y realice cualquier búsqueda en la columna de texto.

+0

Su respuesta interesante esta ya era mi última opción :) pero no quiero duplicar los datos. –

0

Otra respuesta es usar un CTE para quitar el HTML antes de hacer una búsqueda.

El siguiente CTE extrae las posibles filas que satisfacen los criterios de búsqueda y separa recursivamente el código HTML. Luego, la Consulta utiliza los resultados del CTE para filtrar las filas que todavía contienen HTML y las que no coinciden exactamente con los criterios de búsqueda.

El CTE no es tan complicado como parece. La mayor parte del trasteo es para hacer frente a PATINDEX devolver 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 

Esta consulta tiene la limitación de que no se ocupa de la situación en la que> o < está en el texto, pero esto puede ser codificado en torno a si es necesario.

Cuestiones relacionadas