Updatefunktion ist ohne sichtbare Funktion

Ich noch mal.

Warum funktioniert dein Code nur wenn es zwei Spalten gibt aber nicht mehr wenn es drei Spalten gibt? Eigentlich sollte der Code doch die letzten beiden Spalten durch "Information_Schema.Columns" ermitteln und die letzten mir der vorletzten addieren.
 
Werbung:
Ich behaupte er funktioniert auch mit 3 Spalten wenn diese sich addieren lassen (z.B. Integer). Fehlermeldungen sind eine sehr aufschlussreiche Sache.
 
Es gibt keine Fehlermeldung. Aber du hast mir den richtigen Tipp gegeben, es hat was mit dem Format zutun. Da muss ich mir noch was überlegen. Denn bei einen Vorletzten-Wert "Null" nimmt er "Null" auch wenn in der letzten ein Wert vorhanden ist.

Hast du auf Anhieb eine Idee?
 
Jo egal was du mit NULL addierst ergibt es immer NULL, cast() hilft da nicht weil es sich nicht um eine Zeichenkette handelt.

Du kannst NULL-Wete abfangen in dem du nicht einfach nur die Spalten addierst sondern isnull(Spalte1,0) + isnull(Spalte2,0) damit würdest du NULL durch 0 ersetzen.
 
Das ist nicht das Problem, sondern die Tatsache das er "NULL" als Wert einträgt wenn die letzte Spalte einen echten Wert hat (z.B. 100) und die vorletzte Spalte als Wert "Null" hat und die beiden dann addiert.

Also dieser Teil muss verändert werden:
@query3 ='UPDATE ['+ @tabelle +'] SET tmp = ['+ @letzte_spalte +'] + ['+ @vorletzte_spalte +']'
 
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.

Magst du mir bitte noch sagen was ich verändern muss um nicht "null" als Wert zu erhalten wenn die "Vorletzte Spalte" den Wert "null" hatte?
 
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] = isnull([' + @letzte_spalte + '],0) + isnull([' + @vorletzte_spalte + '],0)'
EXEC(@query)
Wie schon gesagt, isnull() kann dir helfen.
 
Hallo, der Code von Ukulele hat bis gestern perfekt funktioniert
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)
Leider habe ich seit heute aber das Problem das mit der Code die Fehlermeldung bei SET @letzte_spalte ebenso wie bei Set @vorletzte_spalte ausgibt, der wie folgt heißt:

Meldung 512, Ebene 16, Status 1, Zeile 76


Die Unterabfrage hat mehr als einen Wert zurückgegeben. Das ist nicht zulässig, wenn die Unterabfrage auf =, !=, <, <=, > oder >= folgt oder als Ausdruck verwendet wird.

Meldung 512, Ebene 16, Status 1, Zeile 77

Die Unterabfrage hat mehr als einen Wert zurückgegeben. Das ist nicht zulässig, wenn die Unterabfrage auf =, !=, <, <=, > oder >= folgt oder als Ausdruck verwendet wird.

Das warum verstehe ich jedoch nicht. Es hat sich von gestern auf Heute nur geändert, dass es mehr Zeile gibt, die Aufgabe aber die der Code aber eigentlich keinen Einfluss haben dürfte.
 
Werbung:
Zurück
Oben