Announcement

Collapse
No announcement yet.

T-SQL: Probleme mit Cursor

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

  • T-SQL: Probleme mit Cursor

    Hallo zusammen

    Ich arbeite gerade an einer Stored Procedure und habe ein paar Probleme mit Cursor.
    Zuerst lese ich mit einem SELECT statement rund 650 Datensätze in eine temporäre Tabele. Dann lass ich den Cursor mit SELECT * über diese temporäre Tabelle loopen.
    Beim ersten Mal aufrufen von FETCH NEXT wird schön brav der erste Datensatz gelesen, @@fetch_status ist 0. Dann führe ich ein simples Insert aus und will den nächsten Datensatz mit FETCH NEXT, und das passt ihm gar nicht und @@fetch_status wird -1, was sovill bedeutet wie "ein Fehler ist aufgetreten". Nur habe ich keine Ahnung, was für ein Fehler aufgetreten sein könnte.

    Hier meine gesamte SP:

    DECLARE @computerid INT
    DECLARE @hostname NVARCHAR(MAX)

    SELECT * INTO #tmp FROM (SELECT ia1.itemid, ia1.attributevalue AS
    hostname
    FROM itemattributes AS ia1
    INNER JOIN (SELECT ia2.itemid, ia2.attributevalue AS username
    FROM itemattributes AS ia2
    WHERE ia2.state LIKE 'active'
    AND ia2.attributeid = 45)
    AS t ON t.itemid = ia1.itemid
    WHERE ia1.state LIKE 'active' AND ia1.attributeid = 39) AS tab1

    DECLARE MyCursor CURSOR FOR
    SELECT * FROM #tmp

    OPEN MyCursor

    FETCH NEXT FROM MyCursor INTO @computerid, @hostname -- funzt!!

    WHILE @@fetch_status = 0
    BEGIN
    INSERT INTO temp (id, asdf) VALUES (@computerid, @hostname) --
    funzt auch !!
    FETCH NEXT FROM MyCursor INTO @computerid, @hostname -- funzt nicht mehr!!!
    END

    CLOSE MyCursor
    DEALLOCATE MyCursor
    DROP TABLE #tmp

  • #2
    Hallo,

    wenn @@Fetch_Status -1 liefert, ist das nicht unbedingt ein Fehler, sondern bedeutet nur, das der Cursor am Ende des Resultset ist.

    Ich tippe mal darauf, das Deine #tmp Tabelle zunächst nur einen Datensatz enthält.
    Über das INSERT des gleichen Datensatzes in die #tmp Tabelle (den Sinn frage ich mal nicht nach), ist der zwar in der #tmp, aber nicht im Cursor enthalten; der ist nämlich statisch bei OPEN gefüllt.

    Olaf.
    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
      Hallo Olaf

      Danke für deine Antwort.
      Ja ich weiss es ist nicht besonders sinnvoll, was ich hier zu fabrizieren versuche ^^ ist nur zum ausprobieren gedacht. Vor dem INSERT soll dann später noch mehr kommen.

      Habe jetzt das ganze so umgestellt, ohne den Weg über die #tmp.
      DECLARE MyCursor SCROLL CURSOR FOR
      SELECT ia1.itemid, ia1.attributevalue AS hostname
      FROM itemattributes AS ia1....etc.

      Hier wird tatsächlich nur 1 Datensatz ausgegegen. Warum, ist mir aber ein Rätsel, denn wenn ich die Query einfach so alleine ausführe, kommen meine 650 Datensätze zurück...?!

      Comment


      • #4
        Einen Grund, das es 2 unterschiedliche Ergebnisse gibt, muss es ja geben.

        Du hast nicht zufällig irgendwie & wo
        SET ROWCOUNT 1
        gesetzt? Nur so ne blöde Idee...
        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
          Hehe, nein leider nicht oder ich wüsste nicht, wo... :-))
          hätte mich wahrscheinlich gelyncht, wenn das der Fall gewesen wäre :-)

          EDIT:
          lol? es hat nun gefunzt. Ich habe einfach das SCROLL beim Cursor deklarieren (siehe mein 2. Post) raus genommen. Beim ersten FETCH stand FETCH LAST statt NEXT. Das kam wahrscheinlich zwischendurch durch Copy&Paste-Fehler da rein.

          EDIT2:
          Nach weiterem herumexperimentieren fand ich heraus, dass die SELECT Query, über die der Cursor loopen soll, kein ORDER BY haben darf. Ist ein solches drin, ist nach 1 Datensatz schluss. Ist es weg, gehen alle durch.
          Zuletzt editiert von m4niac; 28.12.2007, 15:21.

          Comment


          • #6
            zu EDIT2: dann machst du aber noch irgendwo etwas falsch. Ich habe viele Datenübernahmeprogramme geschrieben, die mit Cursor arbeiten mussten und im select die wildesten joins, collations, where-Klauseln und order by hatten, funktionierte immer, nie war da nach dem ersten Datensatz Schluß.

            bye,
            Helmut

            Comment

            Working...
            X