none
Bedingungen in eine Variable schreiben RRS feed

  • Frage

  • Ich möchte eine lange Bedingung, die ich in der gleichen query/SP mehrmals brauche in eineVariable schreiben. Es sieht so aus:

    select sum(PaidAmount) as PaidAmount from Cost
        where Date <@Date  ActNo = @ActNo and  (
        payspc.Code like 'PM%' or
        payspc.Code like 'DL%' or
        payspc.Code like 'DC2%'-- or
        -- es folgen 20 weitere derartige Zeilen )

    Ich möchte nicht mehrfach diesen Bandwurmausdruck (der Ausdruck in Klammern ist fest, die anderen Bedingungen sind variabel) einkopieren, sondern es so vereinfachen wie

        Declare @Bed as varchar(1000);
        set @Bed = 'payspc.Code like 'PM%' or
                            payspc.Code like 'DL%' or
                            payspc.Code like 'DC2%' usw. '

    select sum(PaidAmount) as PaidAmount from Cost
        where Date <@Date  ActNo = @ActNo and @Bed

    Aber das klappt wohl aus verschieden Gründen so nicht. Wie kann man das besser machen?

      


    Mittwoch, 6. Juni 2012 08:45

Antworten

  • Hallo Klaus-Dieter, was hältst Du von einer Sicht?

    create view V_MeineDaten as
    select PaidAmount, Date, Actno
    from Cost
         where (
         payspc.Code like 'PM%' or
         payspc.Code like 'DL%' or
         payspc.Code like 'DC2%'-- or
         -- es folgen 20 weitere derartige Zeilen )

    Später greifst Du dann auf die Sicht zu

    select sum(PaidAmount) as PaidAmount from V_MeineDaten
         where Date <@Date    ActNo = @ActNo

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

    Mittwoch, 6. Juni 2012 09:40

Alle Antworten

  • mit dynamic sql wuerde es gehen aber damit handelst Du Dir andere Probleme ein.

    Du wuerdest dann den SQL Befehl in einem string selber zusammensetzen und dann via executesql ausfuehren.

    aber wenn Du diesen Ausdruck mit etwa 20 Zeilen nur in einer Anweisung brauchst, dann wuerde ich sagen "forget it" / "vergiss es" da Du damit ja keinen Vorteil erreichst sondern nur Probleme einfangen koenntest.

    Also warum stoert es Dich, dass Du die 20 Zeilen auffuehren musst ?

    falls die Anweisung nicht zu haeufig und mit einer grossen Tabelle aufgerufen wird, koenntest Du ja einen Blick auf UDF (user defined function) werfen ob diese Dir besser gefaellt.

    siehe hier fuer UDF : http://msdn.microsoft.com/en-us/magazine/cc164062.aspx


    Please use Mark as Answer if my post solved your problem and use Vote As Helpful if a post was useful.

    Mittwoch, 6. Juni 2012 08:57
  • (ich habe eben noch einen Fehler (or statt Komma) korrigiert )

    Hi Daniel,

    vielen dank für die Info. OK, es sind sogar 35 like-Bedingungen und der ganze Block erscheint dann 15x in der gleichen SP. Das sieht für meinen Geschmack unprofessionell aus und ist vor allem redundant.

    Das mit UDF ist für mich Neuland und jetzt habe ich keine Zeit mich darin zu vertiefen. Aber hast du vielleicht ein Beispiel für dynamic sql?

    Gruß Klaus

    Mittwoch, 6. Juni 2012 09:18
  • Hallo Klaus-Dieter, was hältst Du von einer Sicht?

    create view V_MeineDaten as
    select PaidAmount, Date, Actno
    from Cost
         where (
         payspc.Code like 'PM%' or
         payspc.Code like 'DL%' or
         payspc.Code like 'DC2%'-- or
         -- es folgen 20 weitere derartige Zeilen )

    Später greifst Du dann auf die Sicht zu

    select sum(PaidAmount) as PaidAmount from V_MeineDaten
         where Date <@Date    ActNo = @ActNo

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

    Mittwoch, 6. Juni 2012 09:40
  • Hi Christoph,

    ja natürlich, mit einer View als Vorauswahl kann man das elegant lösen. Peinlich, dass ich da nicht selbst drauf gekommen bin.

    Vielen dank für den Tipp,

    Klaus

    Mittwoch, 6. Juni 2012 10:20