Schwieriges Datenbank-Update (für mich)



  • Hallo,

    ich habe folgendes Problem: Wir haben hier so eine Auftragsverwaltung, es gibt dort eine Tabelle Order und ein Feld darin namens OrderNumber. Das Feld ist ein varchar und der Wert hat immer die Form "XXZZZZZ" oder "XZZZZZ", wobei X bzw. XX die Auftragsart angibt, zum Beispiel "A" oder "FA", auf jeden Fall Buchstaben. Z sind immer Zahlen.

    Früher war es so, dass wenn ein Auftrag in eine andere Auftragsart überführt wurde (datenbanktechnisch heißt das, der Datensatz wird dupliziert), dass er eine komplett neue Nummer erhalten hat. Jetzt soll bei einem überführten Auftrag das ZZZZZ beibehalten werden und nur vorne die Auftragsart geändert werden.

    Es ist völlig klar, dass das System so Bullshit ist. Das ZZZZZ müsste ein eigenes Feld in der Tabelle sein und nicht schon mit irgendwelchen Buchstaben kombiniert. So kann man beim Weiterführen einfach die Zahl nehmen und den neuen Prefix dranhängen. Was ich jetzt bräuchte, wäre ein Update-Statement, was mir aus diesem OrderNumber-Feld die Zahl rausholt und in ein neues Feld schreibt, kann mir da jemand helfen? Das neue Feld soll nicht nullable sein also dieses Statement müsste auch gleich die neue Spalte anlegen und überall befüllen. Ich brauche einfach immer die letzten 5 Zeichen, das neue Feld ist auch wieder ein varchar.

    Wir benutzen den SQL Server 2005.

    Mein Problem ist, dass mir irgendwie die Erfahrung mit SQL fehlt, um da praktisch durch jede row zu gehen und das neue Feld abhängig von dem alten Feld zu befüllen, in einem Statement. Ich nehme mal an, der erste Schritt ist, das Feld als nullable zu erstellen und nach dem Befüllen nicht mehr nullable zu machen.



  • Womit hast Du denn Schwierigkeiten? Klingt so, als bräuchtest Du nur substring, trim und cast oä.



  • Sorry, in meiner Frustration ( 😉 ) habe ich ein bisschen zu viel aufgelabert. Ich reduziere das Problem auf das Wesentliche und jemand mit mehr SQL-Erfahrung wie ich kann mir vielleicht dabei helfen. Ich brauche sowas in der Art:

    (neue Spalte SequenceNumber [nullable] erstellen)
    UPDATE SequenceNumber = [die letzten 5 Zeichen von Spalte OrderNumber]
    (Spalte SequenceNumber auf nicht nullable setzen)
    

    Aber ich glaub, ich krieg das jetzt schon hin. Hab eben auch die passenden String-Funktionen gefunden. Amsonsten meld ich mich morgen nochmal...

    EDIT: cool dass du jetzt auch gerade geantwortet hast. 😃 👍



  • Hatte Deine Antwort gestern übersehen. Hast Du es schon hinbekommen?

    Bin ja mit SQL-Server-Spezifika nicht wirklich auf Du&Du, aber die erste und die dritte Zeile sollten eigentlich nur jeweils ein Alter-Table sein. Und die zweite wirst Du Dir bestimmt mit einem hübschen Subselect sehr erleichtern können.



  • nman schrieb:

    Hatte Deine Antwort gestern übersehen. Hast Du es schon hinbekommen?

    Bin ja mit SQL-Server-Spezifika nicht wirklich auf Du&Du, aber die erste und die dritte Zeile sollten eigentlich nur jeweils ein Alter-Table sein. Und die zweite wirst Du Dir bestimmt mit einem hübschen Subselect sehr erleichtern können.

    Hi, danke der Nachfrage. Ich bin heute nicht in die Arbeit gegangen, deshalb werd ich es erst Morgen probieren.



  • Was ich gesucht habe, war das:

    BEGIN TRANSACTION
    UPDATE [Order]
    SET [SequenceNumber] = substring([OrderNumber], len([OrderNumber]) - 4, 5)
    COMMIT
    

    Man merkt vielleicht schon, mit SQL hab ich sonst nicht viel zu tun. 😉
    Problem gelöst, danke.


Anmelden zum Antworten