Updatefunktion ist ohne sichtbare Funktion

IchHH

Datenbank-Guru
Beiträge
284
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?
 
Werbung:
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.
 
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=*#
 
@ 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.
 
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?
 
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)
 
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.
 
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.
 
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.
 
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.
 
Werbung:
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.
 
Zurück
Oben