Announcement

Collapse
No announcement yet.

Datenübernahme aus anderer Tabelle

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

  • Datenübernahme aus anderer Tabelle

    Hallo zusammen,

    Zuerst mal wünsche ich ein frohes neues Jahr.

    Ich habe gerade ein kleines Problem auf dessen Lösung ich noch nicht komme.
    Ich schreibe ein Script, welches eine Tabelle in meiner Datenbank anlegt.
    Soweit auch erstmal kein Problem.
    Nun kann es aber sein, dass diese Tabelle schon existiert.
    In diesem Fall soll sie durch die neue ersetzt werden.
    In jedem Fall müssen die Daten übernommen werden.
    Ich hatte mir folgendes vorgestellt:

    1: Alte Tabelle umbenennen, wenn sie schon existiert (NAME ==> NAME_old)
    2: Neue Tabelle anlegen (NAME)
    3: Daten aus der alten Tabelle in die neue übernehmen

    Bei Schritt 3 liegt nun mein Problem:
    Ich weiß vorher nicht, wie viele Felder dazu gekommen sind.
    insert NAME
    select * from NAME_old funktioniert nicht (number of supplied values does not match table definition).

    Kann mir jemand helfen?
    Vielleicht ist auch meine Idee für das Vorgehen schlecht.
    Wenn jemand eine bessere Idee hat wäre ich auch dafür dankbar.

    Gruß
    Timo

  • #2
    Du kannst auch die Felder einzeln angeben welche übernommen werden sollen:

    [highlight=sql]
    INSERT INTO name (feld1,feld2,feld3)
    SELECT oldFeld1, TO_NUMBER(oldFeld2), oldFeld3
    FROM name_old
    [/highlight]

    Die Datentypen der alten und der neuen Felder müssen natürlich zusammenpassen bzw. im SELECT statement umgewandelt werden (wie im Beispiel oben oldFeld2 zu einer Zahl umgewandelt wird was vorher vielleicht ein String war).

    Comment


    • #3
      Danke fanderlf, für deine Hilfe...

      Das Problem:
      Ich weiß vorher nicht, welche Felder neu dazugekommen sind. Das Script soll unabhängig von aktuellen Bestand des Systems funktionieren.
      Das mit den passenden Datentypen bekomme ich schon hin.

      Hast du vielleicht noch eine Idee, wie ich das in den Griff bekommen kann?

      Gruß
      Timo

      Comment


      • #4
        Datenübernahme betrifft doch nur die alten Felder, zu den neuen kann es doch keine Daten geben.
        Also alle alten Felder in die neuen schieben (das funktioniert natürlich nur bei gleichnamigen Feldern).

        Wenn Du dennoch Feldnamen wissen musst, ohne sie selber zu kennen, solltest Du auf Dictionary Objekte der Datenbank zugreifen. Hier kann ich Dir allerdings keinen allgemeinen Tip geben.
        Einige DB bieten das Information_Schema an, das sollte diese Infos liefern.
        Gruß, defo

        Comment


        • #5
          Danke defo,

          Klar kannich nur die Daten der alten Felder übernehmen.
          Da ich aber den Bestand nicht kenne, kann ich nicht sagen, welche Felder ich selektieren soll.
          Ich weiß nicht, ob verständlich ist, was ich meine.
          Zum Einfügen der Daten in die neue Tabelle habe ich zwei Möglichkeiten:

          1:
          Code:
          INSERT name
          SELECT * FROM name_old
          Hier ist das Problem, dass ich die Fehlermeldung bekomme: number of supplied values does not match table definition (ist ja auch korrekt)

          2:
          Code:
          INSERT name (feld1, feld2, feld3)
          SELECT ..... FROM name_old
          Hier ist das Problem, dass ich nicht weiß, wie viele Felder die Tabelle name_old hat. Wenn ich wüsste, dass es 2 sind, könnte ich das dritte mit NULL oder einem Default-Wert füllen. Aber es könnte auch sein, dass es nur ein Feld ist. Oder das alle drei schon vorhanden sind.

          Wegen den Dictionary Objekten werde ich mal gucken. Vielleicht kann ich mir in meinem Script daraus irgendwie die Differenz bauen.
          Wenn sonst noch jemand eine Idee hat, würde ich mich sehr freuen.
          Ich suche schon seit Tagen danach und langsam habe ich das Gefühl wahnsinnig zu werden .

          Gruß
          Timo

          Comment


          • #6
            SQL ist per se nicht dynamisch. Wenn dann musst Du das in der Programmiersprache der DB machen und dynamisches SQL verwenden. Mit SQL alleine wirst Du da nicht weit kommen, wenn die Feldanzahl in einem SQL Statement dynamsich sein soll.

            Comment


            • #7
              Ok, das habe ich mir auch gedacht.

              Also ich verwende eine Sybase ASE Datenbank.
              Entsprechend ist das Script was ich schreibe in Sybase Transactional SQL.
              Falls sich damit also jemand auskennt, dann bin ich für Hinweise wirklich sehr dankbar.
              Jetzt werde ich erstmal weiter probieren, die Felder irgendwie zu ermitteln.

              Gruß
              Timo

              Comment


              • #8
                Bei "Script" hatte ich an irgendsowas wie bash/shell script gedacht. Damit kann man doch durchaus ein explizites SQL Insert bauen.

                Bspw. mit einer vorherigen Abfrage der Tabellenspalten:
                select column_name, [data_type]
                from information_schema.columns where table_name='<mytable>'

                Vielleicht schreibst Du noch, was Du da für eine Technik verwendest.

                P.S: Hab Deinen Eintrag verpennt. Also muss es gar nicht "allgemeines" SQL sein?
                Dann kannst Du gezielt die Sybase dictionary Infos anzapfen. Mit script meinst Du dann scheinabre eine Stored Proc.? Da weiß ich nicht genau, was in Sybase alles geht.
                Zuletzt editiert von defo; 03.01.2012, 12:44. Reason: near miss
                Gruß, defo

                Comment


                • #9
                  Also ich hab zumindest Stored Procedures gemeint

                  Comment


                  • #10
                    Hey,

                    Sorry, da habe ich mich wohl unklar ausgedrückt.
                    Ich meine nicht direkt eine Stored Procedure sondern ein SQL in Dateiform.
                    Diese Datei soll im Rahmen einer Installation in die Sybase Datenbank eingespielt werden.
                    Aber soweit ich weiß kann ich da durchaus das ganze Arsenal von Sybase Transactional SQL verwenden.
                    Momentan probiere ich gerade damit rum, die Sybase Schemainfos anzuzapfen.
                    Mal sehen, ob ich da weiterkomme.
                    Ist hier vielleicht noch ein Sybase Fachmann, der mir ein paar Tipps geben kann?

                    Gruß
                    Timo

                    Comment


                    • #11
                      Hier hab ich folgendes Beispiel gefunden:

                      Code:
                      declare @c varchar(100)
                      declare @var varchar(20)
                      select @c = "select " + @var + " from MyTable where " + @var + " <> NULL"
                      exec (@c)
                      Das wäre doch genau das für Dich. Jetzt musst Du nur noch die Spalten herausfinden und dann hast Du Dein Statement. Mit etwas googlen kommt man da sehr schnell durch

                      Die Doku von Sybase sieht auf den ersten Blick auch gar nicht so schlecht aus. Vor allem Kapitel 13.

                      Comment


                      • #12
                        Hey...

                        Ja, das sieht tatsächlich sehr gut aus.
                        Ich werde morgen nochmal damit basteln und dann melde ich mich nochmal.
                        Schließlich will ich ja auch die Lösung des Problems zur Verfügung stellen.

                        Gruß
                        Timo

                        Comment

                        Working...
                        X