Announcement

Collapse
No announcement yet.

Schleife mit Variable?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Schleife mit Variable?

    Hi,

    Ich hab hier grad ein Makro geschrieben und zu Testzwecken mit einer Variablen gearbeitet (test) nun funktioniert das alles soweit so gut und ich möchte das ganze so umschreiben dass ich nicht mehr von Hand die Variable angeben muss sondern dass Makro für jeden Wert aus der Tabelle uniqueprojnr einmal ausgeführt wird.

    Wie kann ich das realisieren? Laut google über for each oder einem cursor aber entweder blick ich das null oder es funktioniert einfach nicht , im Einsatz ist btw MS SQL 2008, hier noch die einzelnen Anweisungen der Reihe nach:



    Count_Erledigte

    update projekt
    set projekt.erledigte =
    (SELECT count (Daten.Status)
    from Daten inner join Projekt on Projekt.id=Daten.Projekt
    where Daten.Status != '0' and projekt.projekt = :test ) where projekt.projekt = :test

    Count_Gesamt

    update projekt
    set projekt.gesamt =
    (SELECT count (Data.Status)
    from Data
    inner join Projekt on Projekt.id=Data.Projekt where projekt.projekt = :test) where projekt.projekt = :test

    Vergleich Gesamt = Erledigte?

    update projekt
    set projekt.text = 'Erledigt' where erledigt = gesamt



    bin für jeden Tipp dankbar.

    Vielen Dank im Vorraus

    lg

    - Marcel
    Zuletzt editiert von Marcel#; 10.11.2009, 15:54.

  • #2
    Hallo Marcel,

    eine Schleife, sprich Cursor, ist immer die schlechteste weil inperformanteste Lösung.
    für jeden Wert aus der Tabelle uniqueprojnr einmal ausgeführt wird
    Dann join die Tabelle noch dazu und mach es in einem Rutsch; eben mengenorientiert.
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Ich habe Probleme bei der Formulierung, mach ich einfach join und where projekt.id = unique proj nr fehlt eben diese for each Bedingung und es wird eben überall wo die Bedingung = uniqueproj eintritt der Wert verändert , Problem ist das uniqueproj von den werten her identisch mit Projektid ist in Projektid sind die Projektnummern nur mehrfach gespeichert.

      Comment


      • #4
        Hallo Marcel,

        ich verstehe Deine Einwände nicht so ganz, wenn in uniqueprojnr alle ProjektId stehen, die aktualisiert werden sollen, dann sollte das so gehen:
        [highlight=SQL]UPDATE projekt
        SET projekt.erledigte =
        (SELECT count (Daten.Status)
        FROM Daten AS D
        inner join Projekt AS P
        on P.id = D.Projekt
        WHERE Daten.Status != '0'
        and P.projekt = projekt.projekt)
        FROM projekt
        INNER JOIN uniqueprojnr
        ON projekt.projekt = uniqueprojnr.projekt
        [/highlight]
        Olaf Helper

        <Blog> <Xing>
        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

        Comment


        • #5
          Das ist eine 1:n Beziehung , soll heißen ein Projekt kann viele Daten Datensätze haben die mit den Projekten verknüpft sind. Das beudetet dass die Bedingung
          ON projekt.projekt = uniqueprojnr.projekt

          immer eintrifft da jede Projektnr. auch in unique Proket enthalten ist und umgekehrt. Es werden hier ja Spalten und keine Tupel verglichen

          Das Makro soll aber genau 1 mal für jede Projektnummer ( test variable) ausgeführt werden und auch nur für diese.

          Also hab das jetzt mal mit verschiedenen where klauseln probiert , hat leider nicht funktioniert was ich brauche ist eben ein for each oder ein loop mit autoincrement, aber trotzdem vielen Dank O. helper

          das mit der Tabelle uniqueprojnr ist evtl. etwas iireführend diese wird im Prinzip nicht benötigt und ist nur ein select distinct der Projektnummern.

          Comment


          • #6
            Wenn ich das richtig verstanden habe, dan möchtest du das nicht für alle Projekte machen, sondern nur für die, die in der Variablen "test" angegeben werden. Okay, gehen wir mal davon aus, dass das nicht gleich tausende von Nummern sind, dann wäre es vielleicht möglich, das Statement so zu gestalten:

            declare @id_liste varchar(400)
            set @id_liste = '1, 2, 33, 44, 55'

            declare @cmd varchar(4000)
            select @cmd = 'update projekt ... where projekt.projekt in (' + @id_liste + ')'
            exec (@cmd)


            bye,
            Helmut

            Comment

            Working...
            X