MSSQL-Update mit Bedingung und Tabellenvariablen
Ich möchte eigentlich eine Tabellenvariable und keine temporäre Tabelle für ein Update benutzen. Aber das funktioniert nicht
Hallo zusammen,
Ich möchte ein bedingtes Update auf eine Tabellenvariable machen. Aber ich weiss leider nicht, wo mein Fehler liegt.
Mit einer temporären Tabelle funktioniert es übrigens.
Sorry, mir ist da bei der Ersetzung meines Realproblems durch Dummybezeichnungen für Tabellen und Spalten ein Fehler unterlaufen. Ich hab ihn jetzt korrigiert.
Zur Erläuterung:
1. @myid ist eine Variable
2.In der Tabelle #test, @tablevariable gibt es auch eine Spalte mit der Bezeichnung myid
3. Wenn es in der zweiten Tabelle myidtable 0 Datensätze gibt, deren Spalte "secondid" mit der Spalte "secondid" in der Tabellenvariablen übereinstimmen und wo gleichzeitig die Spalte myid den Wert der Variable @myid hat, dann schreib "-1" in die Spalte "myid" der Tabellenvariablen ansonsten übernimm den Wert aus der Variablen @myid.
Das funktioniert:
UPDATE #test
SET myid =
CASE (select count(myidtable.myid) from myidtable where myidtable.secondid = #test.secondid and myidtable.myid = @myid)
WHEN 0
THEN -1
ELSE @myid
END
Versuche ich dasselbe mit einer Tabellenvariablen, dann bekomme ich die Fehlermeldung:
Must declare the scalar variable "@tempcharsql2".
UPDATE @tablevariable
SET myid = CASE (select count(myidtable.myid) from myidtable where myidtable.secondid = @tempcharsql2.secondid and myidtable.myid = @myid)
WHEN 0
THEN -1
ELSE @myid
END
verzichte ich auf @tempcharsql2 und schreibe nur secondid dann wird in alle Datensätze, ob sie nun in der zweiten Tabelle einen entsprechenden Treffer haben oder nicht, der Wert auf @myid gesetzt.
3. Versuch:
Update @tablevariable
SET myid =
CASE (select count(myidtable.myid) from myidtable, @tablevariable as p where myidtable.secondid = p.secondid and myidtable.myid = @myid)
WHEN 0
THEN -1
ELSE @myid
END
jetzt kennt er zwar die Tabellenvariable, aber es werden immer noch alle Spalten upgedated, auch die, auf die die Bedingung gar nicht zutrifft....
Recht herzlichen Dank im Voraus für Eure Tipps!
Hallo zusammen,
Ich möchte ein bedingtes Update auf eine Tabellenvariable machen. Aber ich weiss leider nicht, wo mein Fehler liegt.
Mit einer temporären Tabelle funktioniert es übrigens.
Sorry, mir ist da bei der Ersetzung meines Realproblems durch Dummybezeichnungen für Tabellen und Spalten ein Fehler unterlaufen. Ich hab ihn jetzt korrigiert.
Zur Erläuterung:
1. @myid ist eine Variable
2.In der Tabelle #test, @tablevariable gibt es auch eine Spalte mit der Bezeichnung myid
3. Wenn es in der zweiten Tabelle myidtable 0 Datensätze gibt, deren Spalte "secondid" mit der Spalte "secondid" in der Tabellenvariablen übereinstimmen und wo gleichzeitig die Spalte myid den Wert der Variable @myid hat, dann schreib "-1" in die Spalte "myid" der Tabellenvariablen ansonsten übernimm den Wert aus der Variablen @myid.
Das funktioniert:
UPDATE #test
SET myid =
CASE (select count(myidtable.myid) from myidtable where myidtable.secondid = #test.secondid and myidtable.myid = @myid)
WHEN 0
THEN -1
ELSE @myid
END
Versuche ich dasselbe mit einer Tabellenvariablen, dann bekomme ich die Fehlermeldung:
Must declare the scalar variable "@tempcharsql2".
UPDATE @tablevariable
SET myid = CASE (select count(myidtable.myid) from myidtable where myidtable.secondid = @tempcharsql2.secondid and myidtable.myid = @myid)
WHEN 0
THEN -1
ELSE @myid
END
verzichte ich auf @tempcharsql2 und schreibe nur secondid dann wird in alle Datensätze, ob sie nun in der zweiten Tabelle einen entsprechenden Treffer haben oder nicht, der Wert auf @myid gesetzt.
3. Versuch:
Update @tablevariable
SET myid =
CASE (select count(myidtable.myid) from myidtable, @tablevariable as p where myidtable.secondid = p.secondid and myidtable.myid = @myid)
WHEN 0
THEN -1
ELSE @myid
END
jetzt kennt er zwar die Tabellenvariable, aber es werden immer noch alle Spalten upgedated, auch die, auf die die Bedingung gar nicht zutrifft....
Recht herzlichen Dank im Voraus für Eure Tipps!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 131140
Url: https://administrator.de/contentid/131140
Ausgedruckt am: 13.11.2024 um 22:11 Uhr
5 Kommentare
Neuester Kommentar
Hallo stoperror,
ich hoffe es liegt nicht an deinem Namen
SET mylid oder sollte es besser heißen SET @mylid? Im Else sprichst du die Variable ja auch mit @ an, dass wäre ja ein "Error"
Außerdem sollte (muss) man Variablen vor der Benutzung per declare definieren. Sieht aus, als würde er bei der temporären Tabelle eine Spalte mylid erzeugen und nicht eine Variable
Gruß
Netzheimer
ich hoffe es liegt nicht an deinem Namen
Update @tablevariable
SET mylid =
CASE (select count(myidtable.myid) from table2, @tablevariable as p where myidtable.secondid = p.secondid and table2.myid = @myid)
SET mylid =
CASE (select count(myidtable.myid) from table2, @tablevariable as p where myidtable.secondid = p.secondid and table2.myid = @myid)
SET mylid oder sollte es besser heißen SET @mylid? Im Else sprichst du die Variable ja auch mit @ an, dass wäre ja ein "Error"
Außerdem sollte (muss) man Variablen vor der Benutzung per declare definieren. Sieht aus, als würde er bei der temporären Tabelle eine Spalte mylid erzeugen und nicht eine Variable
Gruß
Netzheimer
Moin stoperror,
ehrlich gesagt kann ich mir bei keinem dieser Befehle vorstellen, daß er funktioniert. Du schmeißt da doch ganz wüst irgendwelche Namen durcheinander. Schon in dem angeblich funktionierenden SQL-Befehl werden zwei Spalten myidtable.myid und myidtable.secondid verwendet, aber es gibt gar keine Tabelle myidtable oder einen Tabellenalias myidtable.
Der große Unterschied zum zweiten Befehl ist dann, daß Du #test einmal durch @tablevariable ersetzt und einmal durch @tempcharsql2.
Vielleicht solltest Du ja mal mit dem kompletten Befehl inklusive Deiner Variablendeklaration rausrücken, sonst wird Dir kaum jemand helfen können.
Gruß, Mad Max
ehrlich gesagt kann ich mir bei keinem dieser Befehle vorstellen, daß er funktioniert. Du schmeißt da doch ganz wüst irgendwelche Namen durcheinander. Schon in dem angeblich funktionierenden SQL-Befehl werden zwei Spalten myidtable.myid und myidtable.secondid verwendet, aber es gibt gar keine Tabelle myidtable oder einen Tabellenalias myidtable.
Der große Unterschied zum zweiten Befehl ist dann, daß Du #test einmal durch @tablevariable ersetzt und einmal durch @tempcharsql2.
Vielleicht solltest Du ja mal mit dem kompletten Befehl inklusive Deiner Variablendeklaration rausrücken, sonst wird Dir kaum jemand helfen können.
Gruß, Mad Max
Moin stoperror,
auf die Gefahr hin, dass ich nur die Fragen von netzheimer und Mad Max geringfügig variiere...
Was findest du denn daran verwunderlich, dass du im zweiten Beispiel höflich aufgefordert wirst, doch bitte die Variable "@tempcharsql2" zu deklarieren?
Ich meine - ich hätte an der Stelle des Parsers/der Parserin auch nicht anders reagiert.
Oder gibt es noch irgendwelchen nebensächlichen Details, die du noch nicht erwähnt hast?
Grüße
Biber
auf die Gefahr hin, dass ich nur die Fragen von netzheimer und Mad Max geringfügig variiere...
Was findest du denn daran verwunderlich, dass du im zweiten Beispiel höflich aufgefordert wirst, doch bitte die Variable "@tempcharsql2" zu deklarieren?
Ich meine - ich hätte an der Stelle des Parsers/der Parserin auch nicht anders reagiert.
Oder gibt es noch irgendwelchen nebensächlichen Details, die du noch nicht erwähnt hast?
Grüße
Biber
UPDATE @tablevariable
SET myid = CASE (select count(myidtable.myid) from myidtable where myidtable.secondid = t.secondid and myidtable.myid = @myid)
WHEN 0
THEN -1
ELSE @myid
END
from @tablevariable t
Das nächste Mal solltest Du die Dummies lassen oder zumindest dafür sorgen, daß die Dummies nicht das eigentliche Problem verdecken. In Deinem Beitrag oben steht nämlich immer noch Müll (@tempcharsql2, s. Bibers Posting).
Gruß, Mad Max