2010-08-16 4 views
6

J'ai panneau de commentaires où l'utilisateur peut écrire HTML commentaires formated en utilisant AJAX HTMLEditorComment enregistrer les données HTML dans Sql Server

Je veux enregistrer ce HTML DATA dans le serveur SQL

HTML SOURCE

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

HTML SORTIE

This is nice question 

Maintenant, comment puis-je effectuer une recherche dans ma base de données si votre recherche "est agréable", alors ma requête ne peut pas répondre est agréable parce que la base de données contient aussi des balises HTML.

Alors quelles sont les meilleures pratiques pour enregistrer et récupérer des données HTML en utilisant SQL Query & ASP.net.

Répondre

4

Vous pouvez obtenir un certain kilométrage sur la capacité de recherche en texte intégral de SQL Server. Voici une ressource qui décrit des stratégies pour appliquer la recherche en texte intégral au texte HTML stocké dans SQL Server:

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

+0

Le lien donné ci-dessus a différentes options et tous a Upsides/Downsides alors quelles sont les meilleures méthodes finales et meilleures –

+1

@SOF: C'est une bonne question. Je crains que vous deviez peser les avantages et les inconvénients dans votre scénario spécifique pour décider si cette mise en œuvre est raisonnable. Je le crois. Les clauses LIKE sont extrêmement limitées, comme votre question le démontre si éloquemment. Un index de texte intégral soigneusement mis en œuvre peut ne pas être parfait, mais il étend les limites au-delà de ce qui est possible avec des index et des requêtes plus simples. – kbrimington

2

Si vous utilisez SQL Server 2008, puis l'indexation en texte intégral est une bonne option. Stockez votre code HTML dans une colonne varbinary (max) et définissez son type de fichier associé sur ".html" dans une colonne de type de fichier. L'indexeur de texte intégral analyse les données au format HTML et recherche uniquement le contenu du texte en ignorant les balises HTML.

+0

Nice .. Mais GoDady nous donne SQL Server 2005 –

+0

@SOF Utilisateur: l'indexation de texte intégral est dans SQL Server 2000 et SQL Server 2005 – gbn

+0

Vous ne savez pas si SQL Server 2005 a le filtre HTML pour l'indexation de texte intégral, peut-être juste un 2008 chose. –

0

Stocker les données deux fois dans deux colonnes différentes; une fois en HTML et une autre en texte brut. Effectuez l'affichage à partir de la colonne HTML et effectuez des recherches sur la colonne de texte.

+0

Sa réponse intéressante c'était déjà mon dernier choix :) mais je ne veux pas dupliquer les données. –

0

Une autre solution consiste à utiliser un CTE pour supprimer le code HTML avant d'effectuer une recherche.

Le fichier CTE suivant extrait les lignes susceptibles de répondre aux critères de recherche et supprime récursivement le code HTML. La requête utilise ensuite les résultats du fichier CTE pour filtrer les lignes contenant toujours du code HTML et celles qui ne correspondent pas exactement aux critères de recherche.

Le CTE n'est pas aussi compliqué qu'il n'y paraît. La plupart du tripotage est de faire face à PATINDEX retour 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 

Cette requête a la limitation qu'il ne gère pas la situation dans laquelle> ou < est dans le texte, mais cela peut être codé autour si nécessaire.

Questions connexes