Announcement

Collapse
No announcement yet.

Replace von Leerzeichen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Replace von Leerzeichen

    Hallo zusammen<br>
    ich habe eine Access-Datenbank (eine mde) und darin eine Tabelle mit ca. 500000 Datensätzen. Darin ist eine Artikelnummer enthalten, die allerdings mehrere leerzeichen enthält.<br>
    Ich muss diese Tabelle einlesen und die Leerzeichen komplett entfernen und diese Tabelle dann zum updaten einer Tabelle auf dem SQL-Server verwenden. Leider sind die Leerzeichen an variablen Positionen, so dass ich nicht einfach den String fest zerteilen kann. <br>
    Mein Problem ist, dass ich es nicht hinbekomme, die Leerzeichen aus dem String zu entfernen. Zwar kann ich das mit einer Delphi-Funktion tun, aber das dauert bei der Anzahl von Datensätzen ca 6 Stunden. <br>
    In der SQL-Dokumentation habe ich den Befehl REPLACE gefunden, den ich aber nicht wirklich zu laufen bekomme... hat jemand vielleicht eine kleine Hilfestellung für mich ?<br>
    Wichtig ist, dass ich die Funktionalität in mein Delphi-Programm einbauen kann, da der Anwender letztlich nur noch auf den Knopf drücken soll.<br><br>
    Gruß<br>
    Holger

  • #2
    Hallo,

    da die Datensätze auf dem SQL Server landen sollen, steht dort die REPLACE-Funktion zur Verfügung. Das folgende Beispiel demonstriert dies:
    <pre>
    <b>USE</b> tempdb
    <b>GO</b>
    <br>
    <b>CREATE</b> <b>TABLE</b> ReplaceDemo
    (
    recid <b>INTEGER</b> <b>NOT</b> <b>NULL</b> <b>IDENTITY</b> <b>PRIMARY</b> <b>KEY</b>,
    wert <b>VARCHAR</b>(19) <b>NOT</b> <b>NULL</b>
    )
    <b>GO</b>
    <b>INSERT</b> <b>INTO</b> ReplaceDemo (wert) <b>VALUES</b> (<font color="#9933CC">'12 12 12'</font>)
    <b>INSERT</b> <b>INTO</b> ReplaceDemo (wert) <b>VALUES</b> (<font color="#9933CC">' 11 1 '</font>)
    <b>INSERT</b> <b>INTO</b> ReplaceDemo (wert) <b>VALUES</b> (<font color="#9933CC">' 1 2 3 4 5'</font>)
    <b>GO</b>
    <br>
    <b>SELECT</b>
    recid, <b>REPLACE</b>(wert,<font color="#9933CC">' '</font>, <font color="#9933CC">''</font>) <b>AS</b> WertOhneLeerzeichen
    <b>FROM</b>
    dbo.ReplaceDemo
    </pre>
    Als Ergebnis wird folgendes zurückgeliefert:
    <pre><i>
    recid WertOhneLeerzeichen
    ----- -----------------------
    1 121212
    2 111
    3 12345

    (3 row(s) affected)
    </i></pre>
    In der Delphi-Anweisung kann die REPLACE-Funktion bereits beim Einfügen der Datensätze in die Zieltabelle genutzt werden:
    <pre>
    <b>INSERT</b> <b>INTO</b> ReplaceDemoZiel (wert)
    <b>SELECT</b>
    <b>REPLACE</b>(wert,<font color="#9933CC">' '</font>, <font color="#9933CC">''</font>) <b>AS</b> WertOhneLeerzeichen
    <b>FROM</b>
    dbo.ReplaceDemo
    </pre&gt

    Comment


    • #3
      Hallo Herr Kosch,<br>
      danke für die schnelle Antwort, aber ich habe damit noch ein Problem:<br>
      Die Daten liegen zunächst nicht auf dem SQL-Server sondern in einer ACCESS-Datenbank. Dort müsste ich sie dann erst umwandeln. Oder geht das ganze mit REPLACE nur, wenn die Daten auf dem SQL-Server liegen ?<br>
      Mein Quellcode dazu sieht folgendermassen aus, allerdings funktioniert das mit dem "IN" nicht... <br><br>
      <PRE>
      Command1.CommandText := 'INSERT INTO PLDATATMP(Artikel, Preis, Rabattgruppe, Gewicht) '+
      'SELECT REPLACE(Artikel,'''+' '+''', '''+''') AS WOL, '+
      'Euro, Rabattgruppe, Gewicht '+
      'FROM PLDATA IN '+''''+ Originaldatenbank+''''+';';
      </PRE>
      <br><br>
      Gruß<br>
      Holger Löttge

      Comment


      • #4
        Hallo,

        &gt;Dort müsste ich sie dann erst umwandeln.

        Warum? Es spricht doch nichts dagegen, diese zuerst in eine temporäre Tabelle der MS SQL Server-Datenbank im Rohformat (d.h. mit Leerzeichen) zu kopieren. Dieser Zwischenschritt erlaubt es dann, die leistungsfähigeren Funktionen des MS SQL Server ausnutzen zu können

        Comment


        • #5
          Hallo Herr Kosch,<br>
          das habe ich auchgerade versucht, allerdings ohne Erfolg... ich habe ihr Buch "ADO und Delphi" auf den Knien und versuche nun die Access-Tabelle auf den SQL-Server zu schieben. Und zwar verwende ich dazu den Befehl "OPENROWSET", um auf die ACCESS-DAtenbank zuzugreifen... aber ich bekomme immer eine Fehlermeldung ("...die Informationsdatei für die Arbeitsgruppe fehlt..."<br>
          <PRE>
          Command1.CommandText := 'INSERT INTO PLDATATMP (Artikel, Preis, Rabattgruppe, Gewicht) '+
          'SELECT REPLACE(a.Artikel,'''+' '+''', '''+''') AS Artikel, '+
          'a.Euro, a.Rabattgruppe, a.Gewicht '+
          'FROM OPENROWSET('+''''+'Microsoft.Jet.OLEDB.4.0'+''''+' ,'+''''+OriginalAccessDB+''''+';'+''''+'admin'+''' '+';'+''''+' '+''''+',PLDATA) '+
          'AS a;';

          </PRE>
          Damit wollte ich das in einem Rutsch erledigen, die Daten auf den SQL-SErver zu portieren und gleichzeitig die Umwandlung der Leerzeichen zu generieren... Was stimmt nicht am Quelltext ?<br><br>
          Gruß<br>
          Holger Löttge

          Comment


          • #6
            Hallo,

            &gt;...die Informationsdatei für die Arbeitsgruppe fehlt...

            in diesem Fall kann OPENROWSET die MDB-Datei nicht öffnen. Was passiert, wenn die ACCESS-Datenbankdatei auf der lokalen Festplatte ist und nicht von einem Passwort geschützt wird? Wenn trotzdem eine im Netzwerk gemeinsam genutzte ACCESS-Datenbank genutzt werden soll, stellt <b>sp_addlinkedserver</b> auf der Seite des MS SQL Server einen Weg bereit, um auch die Arbeitsgruppendatei über die Verbindungszeichenfolge anzumelden. Die OPENROWSET-Funktion ist nur eine Adhoc-Abkürzung für den umständlicheren, aber vielfältiger konfigurierbaren Linked Server-Weg

            Comment


            • #7
              Hallo Herr Kosch,<br>
              Ich hab den kleinen Fehler gefunden; das Passwort für den Admin war nicht richtig, da war ein Leerzeichen drin.<br>
              Allerdings erhalte ich jetzt einen TimeOut-Fehler und es werden keine Daten portiert.. ich hab das auch mal ohne den REPLACE-Befehl probiert, aber mit der gleichen Wirkung. <br>
              <PRE>
              Command1.CommandText := 'INSERT INTO PLDATATMP (Artikel, Preis, Rabattgruppe, Gewicht) '+
              'SELECT a.PTNRDRU, a.Euro, a.Rabattgruppe, a.Gewicht '+
              'FROM OPENROWSET('+''''+'Microsoft.Jet.OLEDB.4.0'+''''+' ,'+''''+Mercedes+''''+';'+''''+'admin'+''''+';'+'' ''+''+''''+',PLDATA) '+
              'AS a;';

              </PRE>
              <br>
              Damit sollte es doch eigentlich gehen... tut es aber nicht

              Comment


              • #8
                Hallo Herr Kosch,<br>
                Die Lösung steckte schon in der Fehlermeldung... ich habe das Timeout des Command-Objekts höher gesetzt, das braucht er wohl für die Anzahl der Datensätze... jetzt werden die Daten brav übertragen... <br>
                eine andere Frage habe ich dennoch... gibt es eine Möglichkeit, dem Anwender zu zeigen, wie weit der Fortschritt der command-Anweisung ist ? Weil das Programm ja so aussieht, als täte es garnichts... <br><br>
                Gruß<br>
                Holger Löttge

                Comment


                • #9
                  Hallo,

                  &gt; wie weit der Fortschritt der command-Anweisung ist ?

                  dies geht nur dann, wenn jeder Datensatz einzeln übertragen wird. In diesem Fall ist dem Programm sowohl die Anzahl als auch die aktuelle Position bekannt. Allerdings ist diese Vorgehensweise nicht sinnvoll.

                  Statt dessen sollte das Programm eine Animation (siehe TAnimate) anzeigen (so wie das zum Beispiel der Internet Explorer auch macht)

                  Comment


                  • #10
                    Hallo Herr Kosch,<br>
                    vielen Dank für Ihre Antworten... bin immer wieder begeistert von Ihrer Kompetenz und Ihrem Fachwissen.<br><br>
                    Gruß<br>
                    Holger Löttge

                    Comment

                    Working...
                    X