Hallo zusammen,

mal ein seltsames Phänomen bei einem Kunden (aktuell V7R1 mit letzten PTF's).
Irgendwo (das habe ich schon mal gelesen) hält SQL einen zentralen Cache von ausgeführten SQL's incl. des gesamten Ergebnisses.
Der Kunde hatte ein SQL-Statement per QMQRY ausgeführt und bekam nicht das erwartete Ergebnis (in diesem Fall war z.B. ein Preis falsch).
Diese Preis hat er korrigert, allerdings zeigte das SQL immer noch den falschen Preis.
Daraufhin bekam ich den SQL zur Prüfung zugesendet.
Ich habe den SQL dann per STRSQL eingegeben und ausgeführt und erhielt das korrekte Ergebnis.
Erst nach Rücksprache erfuhr ich, dass QM verwendet wurde und habe den Befehl dann ebenso in QM eingegeben und ausgeführt.
Nun zeigte sich das selbe falsche Ergebnis wie beim Kunden, es wurden nicht die aktuellen Daten somdern die Daten der 1. Ausführung angezeigt.
QM und STRSQL haben somit unterschiedliche Ergebnisse des selben SQL's angezeigt.

Um nun ins Detail zu gehen habe ich den SQL in QM nun leicht modifiziert und siehe da, ich erhielt das korrekte Ergebnis.

Das hat mich dazu gebracht, den SQL mal per ODBC (Excel MS-Query) auszuführen.
Und siehe da, auch in Excel wurde das falsche Ergebnis aus der ersten Ausführung angezeigt. Erst eine leichte Modifikation des SQL's brachte dann das richtige Ergebnis.

Entscheidend ist hier auch, dass der identische SQL verwendet wird.

Ergänzend sei noch gesagt, dass externe UDF's im Spiel sind, deren Ergebnisse ja auch von SQL gecached wird (Deterministic).

Und somit erklärt sich das auch schon wieder:
Deterministic in SQL geht davon aus, dass bei den selben Eingangsparametern immer auch das selbe Ergebnis geliefert wird.
Somit cached SQL das Ergebnis, da SQL ja nicht weiß, dass die UDF ein anderes Ergebnis liefern muss wenn die Datenbasis sich ändert.

Bei solchen UDF's, die also auf sich ändernde Datenbestände zugreifen muss "not deterministic" definiert sein selbst wenn es Performance kostet.