none
case Konstrollstrucktur RRS feed

  • 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
            end

    Was mach ich falsch?

     

    lg

    Donnerstag, 1. Dezember 2011 09:54

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?
    >
    >  
    >
    > lg
     
    Hallo azwinzds1!
     
    CASE ist keine Kontrollstruktur wie IF sondern gehört direkt ins Statement, in
    Deinem Fall so:
     
    update tEingangsBeleg
       set KzAbschluss = isnull(@insKzAbschluss,0),
       AktuellerBereich =
          case
             when snull(@insKzAbschluss,0)=5 then  
                '50'
             else @insBereichsID
          end
    where FirmenID = @insFirmenID and BelegID = @insBelegID
    and BelegArtID = @insBelegArtID
     
     
    Grüße
    Thomas
     
    --
    Any problem in computer science can be solved with another layer
    of indirection. But that usually will create another problem.
                                       David Wheeler
     
    Donnerstag, 1. Dezember 2011 10:57
  • Weil Du das Case in die Feldliste eingebaut hast, statt in das Select?

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    www.insidesql.org/blogs/cmu

    Freitag, 2. Dezember 2011 11:32

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?
    >
    >  
    >
    > lg
     
    Hallo azwinzds1!
     
    CASE ist keine Kontrollstruktur wie IF sondern gehört direkt ins Statement, in
    Deinem Fall so:
     
    update tEingangsBeleg
       set KzAbschluss = isnull(@insKzAbschluss,0),
       AktuellerBereich =
          case
             when snull(@insKzAbschluss,0)=5 then  
                '50'
             else @insBereichsID
          end
    where FirmenID = @insFirmenID and BelegID = @insBelegID
    and BelegArtID = @insBelegArtID
     
     
    Grüße
    Thomas
     
    --
    Any problem in computer science can be solved with another layer
    of indirection. But that usually will create another problem.
                                       David Wheeler
     
    Donnerstag, 1. Dezember 2011 10:57
  • 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 = @insBelegArtID

     

    d.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?

    Freitag, 2. Dezember 2011 08:27
  • 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

    Freitag, 2. Dezember 2011 09:07
  • 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.


    Freitag, 2. Dezember 2011 09:26
    Moderator
  • Weil Du das Case in die Feldliste eingebaut hast, statt in das Select?

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    www.insidesql.org/blogs/cmu

    Freitag, 2. Dezember 2011 11:32
  • Hallo azwinzds1,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Freitag, 9. Dezember 2011 12:26
    Moderator