Service2Max - Die neue Service-Dimension

MS-SQL 2008 Volltextsuche mit Stopwörtern und Coldfusion 8

Erstellt von Patrick Matsumura am 29.03.2010

| View Comments

Heute stand ich vor dem Problem, dass ich eine Volltextsuche mit Coldfusion 8 auf einer MS-SQL 2008 Datenbank realisieren musste. Im ersten Moment dachte ich, dass darin kein Problem besteht. Spätestens als ich versuchte eine Volltextsuche inklusive Stopwort (Wörter wie in, um, und, mit, bei, uns, usw.) mit Coldfusions <cfquery> zu machen, stiess ich auf leere Resultsets. Das gleiche Query im QueryAnalizer oder im SQL Server Management Studio brachte mir die gewünschten Ergebnisse.

Das Problem ist, dass MS-SQL 2008 zwei Resultsets zurückliefert. Das erste ist leer bzw. es enthält die Information, dass der SQL-Server mindestens ein Füllwort gefunden hat und es darum ignoeriert und das zweite enthält das gewünschte Ergebnis der Suche. Nachdem Coldfusions DataDirect Treiber diese “Information” nicht verarbeiten kann, geht es einfach davon aus, dass das Ergbnis ein leeres Resultset ist. Mit diesem Wissen stand ich vor einem neuen Problem: Wie bekomme ich das zweite Resultset von der Abfrage?

Lösung

Die Lösung ist relativ einfach. Ich speichere zunächst mein Query mit Hilfe von <cfsavecontent> in eine Variable. Danach rufe ich die gespeicherte Prozedur (stored Procedure) “sp_executesql” auf und übergebe als Parameter mein zuvor gespeichertes Query.

Etwas Code hilft:

<cfset mySearchString = "Hund, Katze und Maus" />
<cfsavecontent variable="queryString">
	<cfoutput>
SELECT * FROM CONTAINSTABLE(searchTable,searchColumn, '#mySearchString#', LANGUAGE 'GERMAN')
	</cfoutput>
</cfsavecontent>

<cfstoredproc datasource="myDB" procedure="sp_executesql">

      <cfprocparam  cfsqltype="CF_SQL_VARCHAR" value="#queryString#">
      <cfprocresult name="VARIABLES.result1" resultset="1">
      <cfprocresult name="VARIABLES.result2" resultset="2">

</cfstoredproc>

<cfdump var="#VARIABLES#">

Wenn VARIABLES.result2 gesetzt ist und das gewünschte Resultset enthält, dann wurde mit einem Stopwort gesucht. Ansonsten steht das Resultset in VARIABLES.result1.

Jetzt muss nur noch eine Sache geklärt werden: Wie macht man das Query resistent gegen SQL-Injection-Attacken? Ich habe da schon eine Idee. Diese werde ich aber erst nach erfolgreichem Testen hier anfügen, um nicht für unnötige Verwirrung zu sorgen.

Ideen? Verbesserungsvorschläge? Bitte einen Kommentar hinterlassen.

Danke und Gruss,
Patrick

Einen Kommentar schreiben

blog comments powered by Disqus