Finden Sie alle Zeilen in Sql server-Tabelle mit HTML-Tags

Angenommen, ich habe folgende Tabelle:

CREATE TABLE test ( head NVARCHAR(100), body NTEXT ) 

Und in dieser Tabelle wollte ich alle Zeilen finden, wo die Körperspalte HTML-Tags enthält. Irgendwelche HTML-Tags, aber die Lösung sollte nichts verpassen. Mit anderen Worten sind mehr falsche Positives besser als falschere Negative.

Könnte jemand mir helfen, kommen mit einer lebensfähigen Lösung? Wenn dies Code wäre, würde ich anstelle dessen einen HTML-Parser oder einen Regex verwenden. Allerdings habe ich keine Regex-Fähigkeit in SQL server aus der Box (Idealerweise wird dies mit 2005 kompatibel sein, aber kompatibel mit 2008 wird auch funktionieren).

Jede Hilfe wird sehr geschätzt.

Auch das oben ist NTEXT . Würde deine Antwort ändern, wenn der Typ der BODY Spalten der obigen Tabelle NVARCHAR(MAX) ?

Vielen Dank!

Ich stimme den Kommentaren zu der Frage zu, dass mit einem einfachen LIKE '%<%' ausreichen würde. SQL server hat eine regex-ähnliche Verarbeitung mit der PATINDEX function. Diese Antwort hat ein paar Beispiele, sowie die MSDN-Link darüber .

PATINDEX gibt einen Index zurück, wobei 0 ein gültiger Index ist (nur um bekannt zu sein)

 select...where Body like '%<%' and Body like '%>%' 

Da ich daran interessiert war, nicht so viele falsche Positives zu haben, nahm ich das ein bisschen weiter. Nach dem html 5-Standard auf Start-Tags starten Sie mit einem '<', aber danach können Sie nur alphanumerisch für den Tag-Namen haben. Da wir keine Möglichkeit haben, "ein oder mehrere" zu sagen, müssen wir für den ersten Charakter oder zwei nach dem '<' zu begleichen, aber das könnte zumindest die Qualität der Ergebnisse leicht helfen.

Also hier ist ein Charakter nach dem '<', so dass der nächste Charakter alpha-numerisch ist (interessanterweise konnte ich nirgendwo in der Spezifikation finden, die es verbietet, beginnend mit einer Nummer):

 like '%<[A-Za-z0-9]%' 

Wenn du zwei Charaktere tief aussehen möchtest, könnte das zweite character auch '/', '>' oder ein Whitespace sein. Die Sonderzeichen verursachen Probleme, also musst du eine Variable deklarieren, glaube ich, um sie zu treffen:

 declare @html_pattern varchar(50) set @html_pattern = '%<[A-Za-z0-9][A-Za-z0-9/> ' + char(9) + char(10) + char(11) + char(13) + ']%' like @html_pattern 

Auf einer etwas anderen aber verwandten Idee, sollten Sie wahrscheinlich auch nach html Kommentare suchen:

 like '%<!--' 

Nachdem ich das alles gesagt habe, gebe ich zu, dass ich noch nie einen html-Tag mit einer Nummer gesehen habe, und so verwende ich eigentlich:

 declare @html_pattern varchar(50) set @html_pattern = '%<[A-Za-z][A-Za-z0-9/> ' + char(9) + char(10) + char(11) + char(13) + ']%' 

Ich kann es einfach nicht offiziell hier empfehlen, ohne dass jemand über mich springt. Auch für die Aufzeichnung, die einfacher

 like '%<[A-Za-z]%' 

arbeitete genauso gut für meinen datasatz (was freilich nicht so groß ist, und die einzigen falschen Positiven waren in der Form> [0-9]). Ich denke, man könnte sogar weg mit:

 like '%<[az]%' 

denn fast niemand schreibt Tag-Namen mit Großbuchstaben (beachten Sie, dass ich "fast" gesagt habe), besonders wenn Ihre data falsche Positives mit Großbuchstaben haben, aber ich würde lieber nicht diese Chance nehmen.

Als Seitenhinweis wird XML ein anderes Muster haben.

Und das ist so weit wie ich will, ohne regelmäßige Ausdrücke zu gehen.