cfquery und falsche Vermutungen

Mischa Sameli, Geschäftsführer & Leiter Entwicklung

Ein interessantes Phänomen im Zusammenhang von QueryOfQueries habe ich letzthin entdeckt. Kurz gesagt geht es hierbei um eine Datenbankabfrage, die anschliessend noch einmal "lokal" abgefragt wird. Beispiel:

1<!--- alle Datensätze einlesen ---><cfquery name="qryGet" datasource="sql_test">
2SELECT ID,strName,strEmail
3FROM adresse
4</cfquery><!--- neue Spalte strPLZ einfügen ---><cfset QueryAddColumn(qryGet,"strPlz",ArrayNew(1))>
5<!--- Spalte mit Werten auffüllen --->
6<cfloop query="qryGet">
7...
8<cfset QuerySetCell(qryGet,"strPLZ",newValue,qryGet.CurrentRow)>
9...
10</cfloop><!--- neue Abfrage definieren ---><cfquery name="qryQoQ" dbtype="query">
11SELECT strName
12FROM qryGet
13WHERE strPLZ != <cfqueryparam cfsqltype="cf_sql_varchar" value="">
14</cfquery>
So, was geschieht hier?

  1. Es wird eine Datenbankabfrage auf die Tabelle adresse ausgeführt
  2. Wir fügen nachträglich eine neue Spalte strPLZ
  3. Wir füllen die neue Spalte bei allen Datensätzen mit entsprechenden Daten ab
  4. Das Ergebnis der angepassten Datenbankabfrage wird nochmals abgefragt. Jetzt werden nur noch Datensätze ausgelesen, die auch Inhalt haben im neuen Feld strPlz.

Klar – das hätte man auch in einer Abfrage lösen können – es geht nur um ein Beispiel. Um ein einfaches Beispiel. Und zwar geht es darum, was ColdFusion mit dem ersten Ergebnis anstellt. Schauen wir dafür die einzelnen Spalten der Datenbanktabelle an, respektive der Datentyp:

  • ID: Integer
  • strName: varchar
  • strEmail: varchar
  • strPLZ: ?

Also, das neue Feld strPLZ hat keinen spezifischen Datentyp – eigentlich ja auch egal. Würde man meinen. ColdFusion nimmt nun einfach den ersten Wert in dieser Spalte und bestimmt den Datentyp. Handelt es sich beim ersten Wert um eine Zahl, kann dabei also ein Integer oder ein Longinteger rauskommen, beginnt der Wert zum Beispiel mit eine, "CH-" wird das Feld als String abgestempelt. Hoppla, weitere Bearbeitungsschritte können dadurch zu einem fürchterlichen Fiasko werden, wenn man einen Integer erwartet aber einen String erhält – oder umgekehrt. Auf jeden Fall hat ColdFusion seine liebe Mühe damit, wenn es QueryOfQueries ausführen soll und die Typen stimmen nicht überein. Vorsicht mit solchen Geschichten also.