Mit Deiner Fields-Schleife sprichst Du die alle einzelnen Spalten an. Du willst aber nur eine Spalte haben:
str := str + ';' + Fields[0].AsString;
In Deinem ersten Beispiel ist Deine Schleife dennoch korrekt, da Du ja nur eine Spalte abfragst. Da Du aber explizit nach allen Werten aus einer Spalte gefragt hast, dachte ich, es zumindest Deinem Wortlaut nach zu erwähnen.
Ausserdem löschst Du Deine String-Variable str in jedem Zeilendurchlauf, ohne damit irgendetwas getan zu haben.
So iterierst Du korrekt über alle Zeilen und ermittelst alle Werte der Spalte 0:
Delphi-Quellcode:
while not qrySpeichern.Eof do
begin
str := str + ';' + qrySpeichern.Fields[0].AsString;
qrySpeichern.Next;
end;