Benutzer mit den meisten Antworten
case Konstrollstrucktur

Frage
-
Ich versuche einen Trigger zu verändern, und kenne nicht so gut die "case" Kontrollstrucktur. Wollte diese unten (siehe code) verwenden weil ich mir 'if' ersparen wollte und hab von einen Kollegen abgeschrieben. Nur SQL schreibt mir immer eine Fehlermeldung wenn er die Syntax prüft.
Fehler 156: Falsche Syntax in der Nähe des case-Schlüsselwortes
Falsche Syntax in der Nähe von end Schlüsselwort
Folgende Situation:
elect @MyCntBeleg = isnull(count(BelegID),0) from tEingangsBeleg where FirmenID = @insFirmenID and BelegID = @insBelegID and BelegArtID = @insBelegArtID and not isnull(KzAbschluss,0)=2
if not @MyCntBeleg > 0
begin
select @MyCntBeleg = isnull(count(BelegID),0) from tEingangsBeleg where FirmenID = @insFirmenID and BelegID = @insBelegID and BelegArtID = @insBelegArtID and isnull(KzAbschluss,0)=2
if not @MyCntBeleg > 0
begin
select @errno = 1000000, @errmsg = 'Es wurde kein entsprechender Eingangsbeleg gefunden (FirmenID,BelegID,BelegArtID,KzAbschluss ungleich 2). Status kann daher nicht gespeichert werden.'
goto error
end
end else begin
case /*zum auseinanderhalten der EB Belegstati 4,5 und 9 für BH uber das Feld Bereich */
when isnull(@insKzAbschluss,0)=5 then
@insBereichsID='50'
end
update tEingangsBeleg set KzAbschluss = isnull(@insKzAbschluss,0), AktuellerBereich=@insBereichsID where FirmenID = @insFirmenID and BelegID = @insBelegID and BelegArtID = @insBelegArtID
endWas mach ich falsch?
lg
Antworten
-
azwinzds1 schrieb:>> Ich versuche einen Trigger zu verändern, und kenne nicht so gut die "case" Kontrollstrucktur. Wollte diese unten (siehe code) verwenden weil ich mir 'if' ersparen wollte und hab von einen Kollegen abgeschrieben. Nur SQL schreibt mir immer eine Fehlermeldung wenn er die Syntax prüft.>> Fehler 156: Falsche Syntax in der Nähe des case-Schlüsselwortes>> Falsche Syntax in der Nähe von end Schlüsselwort>>>> Folgende Situation:>> elect @MyCntBeleg = isnull(count(BelegID),0) from tEingangsBeleg where FirmenID = @insFirmenID and BelegID = @insBelegID and BelegArtID = @insBelegArtID and not isnull(KzAbschluss,0)=2> if not @MyCntBeleg > 0> begin> select @MyCntBeleg = isnull(count(BelegID),0) from tEingangsBeleg where FirmenID = @insFirmenID and BelegID = @insBelegID and BelegArtID = @insBelegArtID and isnull(KzAbschluss,0)=2> if not @MyCntBeleg > 0> begin> select @errno = 1000000, @errmsg = 'Es wurde kein entsprechender Eingangsbeleg gefunden (FirmenID,BelegID,BelegArtID,KzAbschluss ungleich 2). Status kann daher nicht gespeichert werden.'> goto error> end> end else begin> case /*zum auseinanderhalten der EB Belegstati 4,5 und 9 für BH uber das Feld Bereich */> when isnull(@insKzAbschluss,0)=5 then> @insBereichsID='50'> end> update tEingangsBeleg set KzAbschluss = isnull(@insKzAbschluss,0), AktuellerBereich=@insBereichsID where FirmenID = @insFirmenID and BelegID = @insBelegID and BelegArtID = @insBelegArtID> end>> Was mach ich falsch?>>>> lgHallo azwinzds1!CASE ist keine Kontrollstruktur wie IF sondern gehört direkt ins Statement, inDeinem Fall so:update tEingangsBelegset KzAbschluss = isnull(@insKzAbschluss,0),AktuellerBereich =casewhen snull(@insKzAbschluss,0)=5 then'50'else @insBereichsIDendwhere FirmenID = @insFirmenID and BelegID = @insBelegIDand BelegArtID = @insBelegArtIDGrüßeThomas--Any problem in computer science can be solved with another layerof indirection. But that usually will create another problem.David Wheeler
- Als Antwort vorgeschlagen Stefan HoffmannModerator Freitag, 2. Dezember 2011 19:33
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 9. Dezember 2011 12:26
-
- Als Antwort vorgeschlagen Stefan HoffmannModerator Freitag, 2. Dezember 2011 19:33
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 9. Dezember 2011 12:26
Alle Antworten
-
azwinzds1 schrieb:>> Ich versuche einen Trigger zu verändern, und kenne nicht so gut die "case" Kontrollstrucktur. Wollte diese unten (siehe code) verwenden weil ich mir 'if' ersparen wollte und hab von einen Kollegen abgeschrieben. Nur SQL schreibt mir immer eine Fehlermeldung wenn er die Syntax prüft.>> Fehler 156: Falsche Syntax in der Nähe des case-Schlüsselwortes>> Falsche Syntax in der Nähe von end Schlüsselwort>>>> Folgende Situation:>> elect @MyCntBeleg = isnull(count(BelegID),0) from tEingangsBeleg where FirmenID = @insFirmenID and BelegID = @insBelegID and BelegArtID = @insBelegArtID and not isnull(KzAbschluss,0)=2> if not @MyCntBeleg > 0> begin> select @MyCntBeleg = isnull(count(BelegID),0) from tEingangsBeleg where FirmenID = @insFirmenID and BelegID = @insBelegID and BelegArtID = @insBelegArtID and isnull(KzAbschluss,0)=2> if not @MyCntBeleg > 0> begin> select @errno = 1000000, @errmsg = 'Es wurde kein entsprechender Eingangsbeleg gefunden (FirmenID,BelegID,BelegArtID,KzAbschluss ungleich 2). Status kann daher nicht gespeichert werden.'> goto error> end> end else begin> case /*zum auseinanderhalten der EB Belegstati 4,5 und 9 für BH uber das Feld Bereich */> when isnull(@insKzAbschluss,0)=5 then> @insBereichsID='50'> end> update tEingangsBeleg set KzAbschluss = isnull(@insKzAbschluss,0), AktuellerBereich=@insBereichsID where FirmenID = @insFirmenID and BelegID = @insBelegID and BelegArtID = @insBelegArtID> end>> Was mach ich falsch?>>>> lgHallo azwinzds1!CASE ist keine Kontrollstruktur wie IF sondern gehört direkt ins Statement, inDeinem Fall so:update tEingangsBelegset KzAbschluss = isnull(@insKzAbschluss,0),AktuellerBereich =casewhen snull(@insKzAbschluss,0)=5 then'50'else @insBereichsIDendwhere FirmenID = @insFirmenID and BelegID = @insBelegIDand BelegArtID = @insBelegArtIDGrüßeThomas--Any problem in computer science can be solved with another layerof indirection. But that usually will create another problem.David Wheeler
- Als Antwort vorgeschlagen Stefan HoffmannModerator Freitag, 2. Dezember 2011 19:33
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 9. Dezember 2011 12:26
-
Hallo,
danke, ich hab das jetzt so gemacht, weil ich verschiedene Bereiche habe, ich hoffe das geht so:
update tEingangsBeleg set KzAbschluss = isnull(@insKzAbschluss,0), AktuellerBereich=
case
when isnull(@insKzAbschluss,0)=5 then '50'
when isnull(@insKzAbschluss,0)=4 then '40'
when isnull(@insKzAbschluss,0)=9 then '90'
else '15'
end
where FirmenID = @insFirmenID and BelegID = @insBelegID and BelegArtID = @insBelegArtIDd.h. bei 5 soll der Bereich 50 sine bei 4 -> 40 usw. Kann ich so machen?
aber warum ist case keine Kontrollstrucktur? Gibt es ein case das nicht im Statemant verwendet wird?
-
Hallo,
hab noch ein Problem wollte case Anwenden bei insert into nur lässt das Sys mich nicht, warum?
insert into tEinBelegPosition (FirmenID, BelegID, BelegArtID, BelegPositionsID,
case
when isnull(@insKzAbschluss,0)=5 then '50'
when isnull(@insKzAbschluss,0)=4 then '40'
when isnull(@insKzAbschluss,0)=9 then '90'
else '15'
end as
LadungsNr, LaSeReihung, RelationsID, LSCID, Leistungsperiode, LeistungsDatum, LandID, UStID, PosBetrag, GeaendertVon, GeaendertAm, UStBetrag, LSCText, LaufNr, TeilNr, SendungsID, GeaendertVonBereich, SachKontoID, WaggonAnzahl, WaggonNr, WarenBez, KzRechnungsabgrenzung, AUFT)
select FirmenID, BelegID, BelegArtID, BelegPositionsID, BereichsID, LadungsNr, LaSeReihung, RelationsID, LSCID, Leistungsperiode, LeistungsDatum, LandID, UStID, PosBetrag, GeaendertVon, GeaendertAm, UStBetrag, LSCText, LaufNr, TeilNr, SendungsID, GeaendertVonBereich, SachKontoID, WaggonAnzahl, WaggonNr, WarenBez, KzRechnungsabgrenzung, AUFT
from inserted where
inserted.FirmenID = @insFirmenID and
inserted.BelegID = @insBelegID and
inserted.BelegArtID = @insBelegArtID -
CASE ist ein Ausdruck (Expression) und kein Kontrollstruktur zur Ablaufsteuerung (Control-of-Flow), wie es in anderen Sprachen existiert oder wie es das IF...ELSE ist.
Siehe auch Transact-SQL-Referenz.- Bearbeitet Stefan HoffmannModerator Freitag, 2. Dezember 2011 09:28 broken link
-
- Als Antwort vorgeschlagen Stefan HoffmannModerator Freitag, 2. Dezember 2011 19:33
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 9. Dezember 2011 12:26