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.
Le lien donné ci-dessus a différentes options et tous a Upsides/Downsides alors quelles sont les meilleures méthodes finales et meilleures –
@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