locked
Stringlänge , SQL-Befehl RRS feed

  • Frage

  • Hallo zusammen,

    ich lese von einem SQL-Server eine Menge Felder die ich mit der "as" - Klausel entsprechend zuweise. Dazu gibts am Ende des "Select"-Befehls noch eine where -Klausel. Der ganze String ist zu lang für den armen Fuchs und so hab ich denn folgende Konstruktion gebaut:

    lcTeil1 = "Select SQLFeld1 as VFPFeld1, .......,"
    lcTeil2 = "SQLFeldx as VFPFeldx,..."
    lcTeil3 = " where ...."

    lcLesedaten = lcTeil1 + lcTeil2 + lcTeil3

    &lcLesedaten

    Soweit so toll. Nun kommen noch weitere Felder hinzu und ich frage mich, wieviel Zeichen kann man eigentlich auf diese Weise zusammenbasteln ?
    Ob es funktioniert werd ich ja sehen, aber mal so aus Neugier gefragt.

    Gruss
    Horst

    Mittwoch, 8. August 2012 06:56

Alle Antworten

  • Hilfethema "Visual Foxpro System Capacities":

    1. ein Stringliteral "abc" kann bis zu 255 Zeichen enthalten.

    2. eine Stringvariable wird dort mit 16MB Maximallänge angegeben.
    (Maximum # of characters per character string or memory variable: 16,777,184)

    SPACE(16777185) scheitert tatsächlich. Aber mit FILETOSTR() lassen sich meine ich auch größere Strings einlesen. Nicht alle Stringfunktionen können sauber mit den längeren Strings arbeiten, welche ist aber nicht gesagt. Insofern würde ich die Grenze ernst nehmen, aber sie ist für SQLs, auch komplexere, sowieso irrelevant und recht akademisch.

    3. Nutze TEXT TO lcLesedate NOSHOW ...sql mehrzeilig ... ENDTEXT statt mit so vielen Einzelstrings zu arbeiten. Das hat auch noch die gute Option TEXTMERGE. Das macht auch den Sourcecode sehr viel lesbarer.

    TEXT TO lcSQL NOSHOW TEXTMERGE
        SELECT
            COUNT(*) AS nCount
        FROM
            Rechnungen
        WHERE
            KundeID = <<STR(lnKundeID)>>
    ENDTEXT

    Wobei man im Fall von sowieso schon auf die dynamischen Werte gesetzte Variablen auch aus Sicherheitsgründen besser mit Parameterübergabe per ?Variable arbeitet, also:

    TEXT TO lcSQL NOSHOW TEXTMERGE
        SELECT
            COUNT(*) AS nCount
        FROM
            Rechnungen
        WHERE
            KundeID = ?lnKundeID
    ENDTEXT

    Das darf auch ein Cursorfeld sein: "...KundeID = ?cursorKunden.ID"

    Wobei das sowohl zur Vorbereitung eines SQLEXEC(lnCommandhandle, lcSQL) möglich ist, als auch für native Foxpro interne Ausführung mittels &lcSQL, nur braucht VFP zur Zeilenfortsetzung Semikolons, SQL Server nicht, höchstens als Abschluss, aber da ist das optional.

    Man kann CHR(13)+Chr(10) für VFP auch entfernen bzw. durch ein Leerzeichen ersetzen, SQL Server sind Zeilenumbrüche aber egal.

    Tschüß, Olaf.


    Mittwoch, 8. August 2012 11:38
  • Danke Olaf

    für die wieder sehr ausführliche Antwort! (und eben auch diese kleinen netten Hinweise am Ende).

    Ich werds leicht umstricken auf  TEXT...ENDTEXT weil ich mir bei diesem Kunden nie sicher bin wieviel da noch dran kommt (Felder sind da noch reichlich, ist sowas ähnliches wie die Marsdatenauswertung :-))). Irgendwie denk ich nie daran aber die Funktion ist schon klasse. Ich hab sie bloss so selten gebraucht das ich sie immer wieder vergesse.

    Ausserdem hab ich auch SQLEXEC() am Laufen (& war die alte Fassung, Ordnung ist das halbe Leben, seufz).

    Grüsse
    vom Süntel

    Horst

    Mittwoch, 8. August 2012 12:15