Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

SQL Befehl - Spezifisches Update / Copy von anderem Datensatz

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von speedone, 20 Juni 2013.

  1. speedone

    speedone Benutzer

    Hallo Leute,

    ich habe z. B. folgende Tabellenstruktur "Belegpositionen":
    • Artikelnummer
    • Menge
    • _Extrafeld1
    • _Extrafeld2
    • _Extrafeld3
    Ich möchte nun folgendes mit einem SQL Kommando realisieren:

    Code:
    UPDATE ´Belegpositionen´ SET <alle Felder mit einem Unterstrich vorm Namen>
     
    FROM ´Belegpositionen´
     
    JOIN 'Belegpositionen' ON id= 1
     
    WHERE id=2
    Ich möchte also alle Extrafelder (gekennzeichnet durch einen Unterstrich vorm Namen) aus einem anderen Datensatz der gleichen Tabelle kopieren. Ich möchte aufgrund der hohen Anzahl und öfteren Erweiterung von neuen Extrafeldern dies dynamisch lösen. Es dürfen allerdings nur die Extrafelder "kopiert" werden, da die anderen Felder abweichen können.

    Hat jemand von euch dazu einen Ansatz?

    LG
    speedone
     
  2. ukulele

    ukulele Datenbank-Guru

    Das ist schon ziemlich schwer. Du musst auf jedenfall mit dynamischem SQL arbeiten um den Query zusammen zu setzen und du musst die Spaltennamen aus den Systemtabellen ziehen. Da die Anzahl der Spalten auch Variabel ist wirst du mit Schleifen arbeiten müssen. Haben deine ExtraFelder alle den selben Datentyp?
     
  3. speedone

    speedone Benutzer

    Ich habe mir schon gedacht, dass das nicht leicht wird :)
    Die Extrafelder haben verschiedene Datentypen.

    Ich überlege mir aber nun, da dies ja wahrscheinlich sowieso nicht ohne weiteres als einfacher SQL Befehl umgesetzt werden kann, im Programm mit Schleifen und einzelnen Abfragen umzusetzen.
     
  4. ukulele

    ukulele Datenbank-Guru

    Ich wollte schon drauf los schreiben aber mit verschiedenen Datentypen ist das nicht mehr lustig :)

    Code:
    SELECT    sysobjects.name AS table_name,
            syscolumns.name AS column_name,
            systypes.name AS datatype,
            syscolumns.[length] AS [length]
    FROM    sysobjects
    JOIN    syscolumns ON sysobjects.id = syscolumns.id
    JOIN    systypes ON syscolumns.xtype = systypes.xtype
    WHERE    sysobjects.xtype = 'U'
    AND        sysobjects.name != 'index'
    Über diese Abfrage solltest du schonmal alle Tabellen mit allen Spalten und deren Datentypen ermitteln können. Wenn du hier nach deinem table_name = 'Belegpositionen' AND column_name LIKE '_%' suchst kannst du dir mit Schleifen und Variablen dein SQL Code zusammen stricken (ebenfalls als Variable z.B. @Code VARCHAR(2000)) und dann nachher mit EXEC @code ausführen. Mit reinem SQL geht das sicherlich, ich schätze mal da würd ich ein paar Stunden für brauchen bis das problemlos läuft^^
     
  5. speedone

    speedone Benutzer

    Ja, ich bin schon dabei das Programmseitig umzusetzen. Der zeitliche Aufwand für eine reine SQL Abfrage zu bauen lohnt sich nicht^^
    Danke für deine Hilfe.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Ja, mein Ansatz wäre: vergiß das. Da sind mehrere grobe Fehler:

    • Feldnamen als Träger von Meta-Informationen. Also: UPDATE alle Felder, die mit _ beginnen.
    • hohe Anzahl solcher Felder: vermutlich enthalten sehr, sehr viele dieser Felder später einfach nichts, sind also NULL, stimmt's
    • und, ganz schlimm: 'öfteren Erweiterung von neuen Extrafeldern' - ganz besonders schlimm

    Normalisieren Dein Design. Das, was Du jetzt hast, klingt übertrieben so: Du hast einen Shop, wo es immer wieder neue Artikel gibt. Für jeden neuen Artikel legst Du eine neue Spalte an.
    Das mag jetzt übertrieben sein, aber vielleicht verstehst so besser, was ich meine. Lagere Deine _ExtraFelder in eine separate Tabelle aus und erstelle eine 1:N - dahin.
     
    Walter gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden