Announcement

Collapse
No announcement yet.

Schleife für schon gelöstes Problem

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

  • Schleife für schon gelöstes Problem

    Moinsen. Ich habe ein Problem eigentlich schon gelöst und weiss wie es funktionieren soll, aber ich weiss nciht, wie ich das in eine Schleife packe. Ich könnte das ganze jetzt auch statisch machen, aber das wird dann schon seeeeehr viel Code.

    ich möchte einfach das dieses teil hier von 4 200 durchläuft quasi und das immer in 4er schritten. Genau dort wo ich das @i plaziert habe

    Code:
    SELECT SELECT 
    CASE WHEN ABS(CONVERT(int, dbo.HexStrToVarBin(SUBSTRING(master.dbo.fn_varbintohexstr(HexZahl),@i+2,2) + SUBSTRING(master.dbo.fn_varbintohexstr(HexZahl),@i,2)))) < 5000
    THEN CONVERT(int, dbo.HexStrToVarBin(SUBSTRING(master.dbo.fn_varbintohexstr(HexZahl),@i+2,2) + SUBSTRING(master.dbo.fn_varbintohexstr(HexZahl),@i,2)))
    ELSE CONVERT(int, dbo.HexStrToVarBin(SUBSTRING(master.dbo.fn_varbintohexstr(HexZahl),@i+2,2) + SUBSTRING(master.dbo.fn_varbintohexstr(HexZahl),@i,2))) - 65536
    END
    FROM TxFieldPoint
    Starten soll @i bei 3

    Jedes Ding soll dann quasi in eine eigene Spalte dann immer für sich geschrieben werden. Wenn ich das nämlich selber mache und zwar auscode, werden das 100te zeilen von Code, die man einfach in eine Schleife packen könnte :-)
    Zuletzt editiert von Toni91; 02.10.2012, 15:26.

  • #2
    Originally posted by Toni91 View Post
    ..
    ich möchte einfach das dieses teil hier von 4 200 durchläuft quasi
    ..
    Jedes Ding soll dann quasi ..
    Dinger und Teile, da fällt mir nicht viel zu ein. Und was bedeutet "..von 4 200.."?
    Und es gibt keine Schleifen in SQL, SQL arbeitet mengenbasiert.

    Vielleicht beschreibst Du mal genauer, was Du erreichen möchtest. Da wäre bspw. die Ausgangsmenge und die gewünschte Ergebnismenge (exemplarisch). Dazwischen gäbe es dann die gesuchte Transformation.
    Gruß, defo

    Comment


    • #3
      Originally posted by defo View Post
      Dinger und Teile, da fällt mir nicht viel zu ein. Und was bedeutet "..von 4 200.."?
      Und es gibt keine Schleifen in SQL, SQL arbeitet mengenbasiert.

      Vielleicht beschreibst Du mal genauer, was Du erreichen möchtest. Da wäre bspw. die Ausgangsmenge und die gewünschte Ergebnismenge (exemplarisch). Dazwischen gäbe es dann die gesuchte Transformation.
      Natürlich gibt es in SQL Schleifen o.O ich möchte halt überall wo ein @i ist, dass er in 4er Schritten weiterspringt, also am schluss das Inkrement

      @i = @i + 4

      Und ich möchte dann, dass er jeden Schleifendurchlauf in einer eigenen Spalte speichert. Das wars eigentlich schon. Praktischen den Code den ich gepostet habe, in eine Schleife basteln. Ich könnte es auch statisch coden, aber das wird dann ewig viel Code. @i soll dann bei 4 anfangen

      Comment


      • #4
        Hallo,
        Originally posted by Toni91 View Post
        Natürlich gibt es in SQL Schleifen
        Nein, in SQL gibt es keine Schleifen! Mag sein, dass man in TSQL in einer SP Schleifen programmieren kann, aber für eine reine SQL-Abfrage gibt es KEINE Schleifenkonstrukte. Und in "Spalten" kann man nichts "speichern".
        Das mag für dich Krümelkackerei sein, aber ohne korrekte Begrifflichkeiten kommen wir zu keiner vernünftigen Lösung, da niemand genau weiss wovon du redest. Aber mit Begrifflichkeiten scheinst du ja Probleme zu haben - siehe "Dinger und Teile"

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Originally posted by Falk Prüfer View Post
          Hallo,

          Nein, in SQL gibt es keine Schleifen! Mag sein, dass man in TSQL in einer SP Schleifen programmieren kann, aber für eine reine SQL-Abfrage gibt es KEINE Schleifenkonstrukte. Und in "Spalten" kann man nichts "speichern".
          Das mag für dich Krümelkackerei sein, aber ohne korrekte Begrifflichkeiten kommen wir zu keiner vernünftigen Lösung, da niemand genau weiss wovon du redest. Aber mit Begrifflichkeiten scheinst du ja Probleme zu haben - siehe "Dinger und Teile"

          Gruß Falk
          Was soll man auf sowas jetzt antworten? Was verstehst du jetzt daran nicht? Du hast schon recht das in SQL eine Ausgabe angezeigt wird bei SELECT Befehlen und nicht gespeichert und Dinge und Teile war auch nicht gerade die saubere Wortwahl geb ich schon zu. Aber wenn du noch mehr von mir wissen willst, musst du mir auch sagen was.

          Hier z.B. eine Schleife

          Code:
          DECLARE @text varchar(255);
          SET @text = 'Hallllllloooooooooooo';
          
          DECLARE @sql varchar(255);
          SET @sql = 'SELECT ';
          
          DECLARE @i int;
          SET @i = 1;
          
          WHILE (@i < len(@text))
          BEGIN
          		SET @sql = @sql + '''' + SUBSTRING(@text, @i, 1) + ''', ';
          		SET @i = @i + 1;
          END
          SET @sql = @sql + '''' + SUBSTRING(@text, @i, 1) + '''';
          
          EXEC (@sql);
          Tut mir leid wenn ich euch zu inkompetent in SQL rüber komme, aber das ist nunmal ein Forum und ich wollte hier halt eine Frage stellen.

          Comment


          • #6
            Originally posted by Toni91 View Post
            Tut mir leid .., aber das ist nunmal ein Forum und ich wollte hier halt eine Frage stellen.
            Ok, stell Dir einfach vor, das niemand hier in Deiner Problemwelt lebt. Fachbegriffe gibt es nicht aus Langeweile, etwas Sorgfalt bei der Fragestellung kann nicht schaden.

            Was Du oben als Schleife aufgeführt hast, ist TSQL und nicht SQL. Ersteres dient der Datenverarbeitung, letzteres der Datenabfrage bzw. Darstellung.
            Möchtest eine Datenausgabe? Dann ist TSQL nicht unbedingt geeignet.
            Was Du schreibst, hört sich so an, als ob Du per Abfrage dynamisch Spalten erzeugen möchtest.

            Erzähl mal.
            Gruß, defo

            Comment


            • #7
              Also, ich möchte normal Daten ausgeben. Dazu aber eben noch diese Query, die diesen großen String zerlegt und das immer im 4er Schritten tun soll

              Beispiel
              PHP Code:
              SELECT KundennrName
              CASE 
              WHEN ABS(CONVERT(intdbo.HexStrToVarBin(SUBSTRING(master.dbo.fn_varbintohexstr(HexZahl),@i+2,2) + SUBSTRING(master.dbo.fn_varbintohexstr(HexZahl),@i,2)))) < 5000
              THEN CONVERT
              (intdbo.HexStrToVarBin(SUBSTRING(master.dbo.fn_varbintohexstr(HexZahl),@i+2,2) + SUBSTRING(master.dbo.fn_varbintohexstr(HexZahl),@i,2)))
              ELSE 
              CONVERT(intdbo.HexStrToVarBin(SUBSTRING(master.dbo.fn_varbintohexstr(HexZahl),@i+2,2) + SUBSTRING(master.dbo.fn_varbintohexstr(HexZahl),@i,2))) - 65536
              END
              FROM Table 
              Jetzt möchte ich das Dynamisch dann immer zu diesen String Spaltenweise die einzelnen Werte für i ausgeben (mit inkrement um 4) werden also

              Spalte 1: Kundennr, Spalte 2: Name, Spalte 3: Dieser Case mit i = 1, Spalte 4: Dieser Case mit i = 5, Spalte 5 DIeser Case mit i=9,.......

              Dies soll so lange gemacht werden, bis i die Zahl 200 erreicht hat.

              Soweit verständlich erklärt?

              Edit auf deine Frage: Ich möchte eigentlich nur Daten Abfragen, mit diesen mache Ich Transformationen, die aber nicht gespeichert werden

              Comment


              • #8
                Originally posted by Toni91 View Post
                Jetzt möchte ich das Dynamisch dann immer zu diesen String Spaltenweise ..
                Du könntest das unter TSQL wahrscheinlich erreichen, indem Du eine StoredProcedure baust, die einen Cursor auf die dynamisch erzeugte Datenmenge liefert. Ich kenne mich dazu leider nicht gut genug mit TSQL, MS SQL aus.

                M.E. wäre die einfachste Lösung, wenn Du das SQL Statement dynamisch im Client zusammenstellst, Deine "Schleife" also im Client anwendest, select clauses für Deine 50 Spalten erzeugst und das fertige Statement abschickst.

                Alternativ gäbe es die Möglichkeit, Deine 200er Menge (oder 200/4 Menge) als Tabelle abzulegen und mittels Pivot Abfragen zu arbeiten. Für die Pivot Funktionen unter MS SQL brauchst Du aber je nachdem einen relativ aktuelle Serverversion.
                Gruß, defo

                Comment


                • #9
                  Hallo Toni91,

                  eine Schlaufe brauchst du, das ist mal fix. Die Frage ist jetzt, ob diese am Client damit das SQL-Statement erstellt oder ob du das mittels stored proc (die du dann mit EXEC aufrufst) am Server machst. Hängt davon ab, wo du dir mit der Schleifenprogrammierung leichter tust.

                  Statement am Client erstellt:
                  Vorteil: geht auch bei einer Datenbank, die keine stored procs kennt
                  Nachteil: Statement könnte u.U. zu lange werden.

                  Statement am Datenbankserver erstellt:
                  Vorteil: wird immer funktionieren, auch wenn es mal mehr als 200 Spalten werden.
                  Nachteil: man ist an die Datenbank gebunden.

                  bye,
                  Helmut

                  PS: ich würde es am Server machen und du bist mit deinem Schleifen-Beispiel schon auf dem richtigen Weg, da fehlt nicht mehr viel :-)

                  Comment


                  • #10
                    Originally posted by hwoess View Post
                    Hallo Toni91,

                    eine Schlaufe brauchst du, das ist mal fix. Die Frage ist jetzt, ob diese am Client damit das SQL-Statement erstellt oder ob du das mittels stored proc (die du dann mit EXEC aufrufst) am Server machst. Hängt davon ab, wo du dir mit der Schleifenprogrammierung leichter tust.

                    Statement am Client erstellt:
                    Vorteil: geht auch bei einer Datenbank, die keine stored procs kennt
                    Nachteil: Statement könnte u.U. zu lange werden.

                    Statement am Datenbankserver erstellt:
                    Vorteil: wird immer funktionieren, auch wenn es mal mehr als 200 Spalten werden.
                    Nachteil: man ist an die Datenbank gebunden.

                    bye,
                    Helmut

                    PS: ich würde es am Server machen und du bist mit deinem Schleifen-Beispiel schon auf dem richtigen Weg, da fehlt nicht mehr viel :-)
                    Wie da fehlt nichtmehr viel? Hab die letzten Tage daran rumgetüftelt und komme garnicht weiter x.X

                    Comment


                    • #11
                      Hast du eine fixe Tabelle mit allen (200) Spalten oder soll die auch erst zur Laufzeit erzeugt werden?
                      Und willst du das mit einer stored proc oder einer UDF lösen?

                      bye,
                      Helmut

                      Comment


                      • #12
                        Die Daten die ich mir holen will, liegen auf einen MSSQL Sever und sind schon abgeschlossen(also die die ich will). Natürlich kommen in der Tabelle ständig neue Daten an, aber ich möchte nicht gleich sofort wenn diese am Server ankommen das mit denen durchführen. Es soll auch nicht gespeichert werden, sondern lediglich einfach in meiner SELECT clause angezeigt werden. An der Tabelle auf dem Server möchte ich nichts (!) verändern

                        Ich weiss nicht mit was ich das durchführen möchte. Aber ich wollte eigentlich direkt am Server Bleiben. Da ist eine stored proc besser oder?

                        Comment


                        • #13
                          Hier ein Beispiel mit 50 Zufallszahlen :-)

                          create table #tmp (spalte1 int)
                          insert into #tmp values (null) -- generiere einen leeren Datensatz

                          declare
                          @anz int, -- Spaltenanzahl
                          @i int, -- Schleifenzaehler
                          @cmd varchar(99), -- Hilfsvariable fuer EXEC
                          @wert int -- Hilfsvariable fuer Wert

                          set @anz = 50 -- Demo mit 50 Spalten

                          ------------------------------ Spalten in der Tabelle generieren

                          set @i = 2 -- Spalte 1 existiert schon daher hier erst mit 2 beginnen ...
                          while @i <= @anz begin
                          set @cmd = 'alter table #tmp add spalte' + CAST(@i as varchar) + ' int'
                          exec (@cmd)
                          set @i = @i + 1
                          end

                          ------------------------------- Werte eintragen
                          set @i = 1
                          while @i <= @anz begin
                          SELECT @wert = RAND() * 999
                          set @cmd = 'update #tmp set spalte' + CAST(@i as varchar) + ' = ' + CAST(@wert as varchar)
                          exec (@cmd)
                          set @i = @i + 1
                          end

                          ----------------------------------- Ergebnis
                          select * from #tmp
                          drop table #tmp


                          bye,
                          Helmut
                          Zuletzt editiert von hwoess; 12.10.2012, 17:02. Reason: Formatierung verbessert (hat nicht funktioniert)

                          Comment

                          Working...
                          X