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

Updatefunktion ist ohne sichtbare Funktion

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von IchHH, 29 Mai 2017.

  1. IchHH

    IchHH Datenbank-Guru

    Hallo, ich nutze zur Zeit ein Updatecode um eine Tabelle die in einer Spalte den Wert "Null" hat durch Werte einer anderen Tabelle zu ersetzen. Dieses sieht wie folgt aus:

    Code:
    DECLARE    @kopf varchar(100)
    SET @kopf = (Select Case When DateName(dw,GetDate()) = 'Montag'
                    Then 'Saldo vom ' + Convert([nvarchar](10),DateAdd(day,0,GetDate()),104)
                    Else 'Saldo vom ' + Convert([nvarchar](10),DateAdd(day,0,GetDate()),104) End);
    
    Update [DOM1\20-DIAS].S_92620
        SET @kopf = @kopf
    From [DOM1\20-DIAS].tmp As A INNER JOIN
                           [DOM1\20-DIAS].S_92620 As B ON B.Kontenart = A.Kontenart
    Zwar zeit er mir an das er den auf 48 Zeilen anwenden konnte, schaue ich aber in die S_92620 rein, hat sich überhaupt nix getan.

    Habe ich die Funktion dieses Codes falsch verstanden?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Code:
    SET @kopf = @kopf
    
    erscheint mir massiv sinnfrei.
     
  3. IchHH

    IchHH Datenbank-Guru

    Warum das? Wenn ich den Code richtig verstanden haben muss dort doch angegeben werden welche Spalte ich aus Tabelle b (1. @kopf) durch den in Tabelle a (2. @kopf) ersetzen möchte oder? In beiden Tabellen heißt die Überschrift aber gleich.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    vermutlich passiert folgendes:

    Code:
    test=# create table ich_hh(id int, val int);
    CREATE TABLE
    test=*# insert into ich_hh values(1, 10);
    INSERT 0 1
    test=*# update ich_hh set val=val;
    UPDATE 1
    test=*# select * from ich_hh ;
     id | val
    ----+-----
      1 |  10
    (1 Zeile)
    
    test=*#
    
     
  5. ukulele

    ukulele Datenbank-Guru

    @ bezeichnet im MSSQL-Duktus immer eine Variable, du setzt also die Variable gleich sich selbst und das so oft wie dein Join Zeilen liefert. Du kannst natürlich deine Variable hinter dem Gleichheitszeichen verwenden oder eine Spalte gleich einer anderen Spalte setzen, du solltest aber nie eine Spalte wie eine Variable bennen, das ist mehr als verwirrend. Deine Spalte müsste zudem mindestens mit [@kopf] angesprochen werden und wenn es mehr als eine Spalte mit diesem Namen gibt natürlich auch noch mit Tabellenname oder Alias davor weil sonst nicht eindeutig.
     
  6. IchHH

    IchHH Datenbank-Guru

    Hallo ich habe die Spalte aber nicht wie meine Variable benannt. Die Variable heißt kopf die Spalte heißt "Saldo vom 29.05.2017". Wenn ich dich richtig verstanden haben hätte ich zur Verdeutlichung "SET b.@kopf = a.@kopf" setzen müssen?
     
  7. IchHH

    IchHH Datenbank-Guru

    Genau das wollte ich auch erreichen.
     
  8. IchHH

    IchHH Datenbank-Guru

    Keine Antwort mehr?
     
  9. akretschmer

    akretschmer Datenbank-Guru

    hast Du denn das, was bisher gesagt wurde, umgesetzt?
     
  10. ukulele

    ukulele Datenbank-Guru

    Achso jetzt verstehe ich erst was da deinem Geiste entspringt.

    Du hast den Spaltennamen in der Variable @kopf abgelegt. Du kannst Spaltennamen aber nicht innerhalb des Querys aus einer Variable auslesen, du musst (wie schon vorher) mit dynaischem SQL arbeiten. Zudem muss natürlich Tabellenalias und Name davor und dein Spaltenname muss vermutlich auch in eckige Klammern:
    Code:
    DECLARE   @kopf varchar(100),@query VARCHAR(8000)
    
    SET @kopf = (Select Case When DateName(dw,GetDate()) = 'Montag'
      Then 'Saldo vom ' + Convert([nvarchar](10),DateAdd(day,0,GetDate()),104)
      Else 'Saldo vom ' + Convert([nvarchar](10),DateAdd(day,0,GetDate()),104) End);
    
    SET @query = '
    Update [DOM1\20-DIAS].S_92620
    SET b.[' + @kopf + '] = a.[' + @kopf + ']
    From [DOM1\20-DIAS].tmp As A INNER JOIN
    [DOM1\20-DIAS].S_92620 As B ON B.Kontenart = A.Kontenart'
    
    EXEC(@query)
     
  11. IchHH

    IchHH Datenbank-Guru

    Jein, ich hatte eine Gegenfrage gestellt. Wobei mir die Antwort auf meine Frage schon klar ist, schließlich zeigt mir das Programm schon das mein Vorschlag nicht geht obwohl er das umsetzt was ihr gesagt hattet.
     
  12. IchHH

    IchHH Datenbank-Guru

    Wie also funktioniert nun die Updatefunktion? Wenn ich nun vorhabe die letzte und die Vorletzte Spalte einer Datenbank zu addieren, wie müsste ich dann vorgehen, wenn ich nicht weiß wie die beiden Spalten überhaupt heißen, dass heißt ich die also auslesen muss. Mit
    Code:
    SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'S_92620'
    könnte ich zwar arbeiten nur mit der Ergebnisverwertung käme ich nicht weiter um die entsprechende Berechnung durchzuführen.
     
  13. ukulele

    ukulele Datenbank-Guru

    Du verrenst dich immer weiter in dein kaputtes Design, nur so am Rande.
    Code:
    DECLARE   @ordinal INT,
         @tabelle VARCHAR(100),
         @letzte_spalte VARCHAR(100),
         @vorletzte_spalte VARCHAR(100),
         @query VARCHAR(8000)
    
    SET     @tabelle = 'S_92620'
    SET     @ordinal = ( SELECT max(ORDINAL_POSITION) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tabelle )
    SET     @letzte_spalte = ( SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tabelle AND ORDINAL_POSITION = @ordinal )
    SET     @vorletzte_spalte = ( SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tabelle AND ORDINAL_POSITION = @ordinal - 1 )
    
    SET     @query = 'UPDATE [' + @tabelle + '] SET [zielspalte] = [' + @letzte_spalte + '] + [' + @vorletzte_spalte + ']'
    EXEC(@query)
    Aber vorsicht, dieser Code wird vermutlich irgendwann das Universum zerstören.
     
  14. IchHH

    IchHH Datenbank-Guru

    Mag sein das ich mich in mein Design verrenne, der einzige Ausweg wäre aber eine Schulung. Diese sind aber zum einen sehr teuer und zum anderen von den Terminen noch weit in der Zukunft und schließlich will ich jetzt vorankommen.
     
  15. akretschmer

    akretschmer Datenbank-Guru

    Das vergurkte Design, welches Du mit Deiner Frickelei jetzt zementierst, später zu korrigieren wird definitiv teurer als eine Schulung. Freundliche Grüße an Deinen Chef.
     
    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