2010-08-16 23 views
6

Ho pannello di feedback dove l'utente può scrivere codice HTML valutazioni formattato utilizzando AJAX HTMLEditorCome salvare i dati HTML in SQL Server

Voglio salvare questi dati HTML in SQL Server

sorgente HTML

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

output HTML

This is nice question 

Ora come Posso cercare al mio database se il ritrovamento "è bello", allora la mia domanda non è possibile risposta è bello perché database contiene tag HTML troppo.

Dunque, quali sono le migliori pratiche per salvare e recuperare dati HTML utilizzando SQL Query & ASP.net.

risposta

4

si potrebbe ottenere qualche chilometraggio funzionalità di ricerca full-text di SQL Server. Qui è una risorsa che descrive le strategie per applicare la ricerca full-text di testo HTML memorizzati in SQL Server:

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

+0

Il collegamento sopra indicato ha diverse opzioni e tutto ha Upsides/Downsides quindi qual è il miglior metodo finale e migliore –

+1

@ SOF: Questa è una domanda giusta. Temo che dovrai valutare i vantaggi e gli svantaggi nel tuo scenario specifico per decidere se questa implementazione è ragionevole. Credo che sia. Le clausole 'LIKE' sono estremamente limitate, come dimostra la tua domanda in modo eloquente. Un indice full-text attentamente implementato potrebbe non essere perfetto, ma estende i limiti oltre ciò che è possibile con indici e query più semplici. – kbrimington

2

Se stai usando SQL Server 2008 poi indicizzazione full-text è una buona opzione. Memorizza il codice HTML in una colonna varbinary (max) e imposta il tipo di file associato su ".html" in una colonna di tipo file. L'indicizzatore full-text analizzerà i dati come HTML e cercherà solo il contenuto del testo ignorando i tag HTML.

+0

Nizza .. Ma GoDady ci dà SERVER SQL 2005 –

+0

@SOF utente: Testo integrale indicizzazione è in SQL Server 2000 e SQL Server 2005 – gbn

+0

Non sono sicuro se SQL Server 2005 ha il filtro HTML per l'indicizzazione full-text, potrebbe essere solo un 2008 cosa. –

0

Memorizzare i dati due volte in due colonne diverse; una volta come HTML e un altro come solo testo. Esegui la visualizzazione dalla colonna HTML ed esegui qualsiasi ricerca sulla colonna di testo.

+0

La sua risposta interessante questa era già la mia ultima scelta :) ma non voglio duplicare i dati. –

0

Un'altra risposta è quella di utilizzare un CTE per togliere il codice HTML prima di fare una ricerca.

Il seguente CTE estratti probabili righe che soddisfano i criteri di ricerca e ricorsivamente strisce fuori il codice HTML. Query utilizza quindi i risultati del CTE per filtrare le righe ancora contenenti HTML e quelle che non corrispondono esattamente ai criteri di ricerca.

Il CTE non è così complicato come sembra. La maggior parte del giocherellare è quello di far fronte con PATINDEX ritorno 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 

Questa query ha la limitazione che non gestisce la situazione in cui> o < è nel testo, ma questo può essere codificato in giro, se necessario.

Problemi correlati