Odium: datensätze zählen mit select count(*)...

Hallo,

hab da ein kleines Problem.

Um die Anzahl der ausgewählten datensätze zu beginn der seite anzeigen zu können tue ich dies:

rs_c = cn.Execute("SELECT COUNT(*) FROM tblEintraege")

das bringt mir auch eine zahl, aber natürlich die gesamtanzahl der datensätze in der db (MS SQL-Server 7)

die wirkliche anzahl ist aber geringer, da das auslesende sql-statment mit einer umfangreichen WHERE - Klausel ausgestattet ist.
wenn ich diese where-klausel in die obere abfrage einbaue läuft aber gar nichts mehr...:
-------------------
Microsoft OLE DB Provider for ODBC Drivers- Fehler '80040e14'

[Microsoft][ODBC SQL Server Driver][SQL Server]Spaltenname 'tblEintraege.bereich' ist in der ORDER BY-Klausel ungültig, da er nicht in einer Aggregatfunktion enthalten und keine GROUP BY-Klausel vorhanden ist.
-------------------
auch die betreffenden felder statt des * einzutragen bringt einen syntaxfehler...obwohl alles korrekt aussieht

was ist zu tun?
ich muss halt die suchtreffer am anfang der seite anzeigen können, um die suchergebnisse auf mehrere seiten zu verteilen...
stimmt es eigenlich das die sql-syntax des ms-sql server keine limit anweisung kennt?
das ist zwar nicht sehr schön, kann man aber umgehen...

Danke

Odium

  1. Hi Odium

    die wirkliche anzahl ist aber geringer, da das auslesende sql-statment
    mit einer umfangreichen WHERE - Klausel ausgestattet ist.
    wenn ich diese where-klausel in die obere abfrage einbaue läuft aber gar nichts mehr...:

    Microsoft OLE DB Provider for ODBC Drivers- Fehler '80040e14'

    [Microsoft][ODBC SQL Server Driver][SQL Server]Spaltenname 'tblEintraege.bereich'
    ist in der ORDER BY-Klausel ungültig, da er nicht in einer Aggregatfunktion
    enthalten und keine GROUP BY-Klausel vorhanden ist.

    auch die betreffenden felder statt des * einzutragen bringt einen
    syntaxfehler...obwohl alles korrekt aussieht

    Dein Order by ist ein Problem, er kann nicht nach etwas sortieren,
    das gar nicht zum Resultat gehört sondern nur eine einzelne Spalte
    deren Name (korrigiere mich wenns bei MS-SQL nicht so ist, den
    kenn ich nicht gut) du mit select count(*) as xyz vergeben könntest,
    wenn du das nicht tust aber zufällig vom DBMS vergeben wird.

    Wenn die Where clause auch noch andere Probleme macht, bitte hier
    posten.

    ich muss halt die suchtreffer am anfang der seite anzeigen können,
    um die suchergebnisse auf mehrere seiten zu verteilen...

    Du wirst kaum um zwei Abfragen herumkommen da du zwei völlig verschiedene
    Dinge von der Datenbank haben willst. Unter Umständen kannst du deine
    zwei Queries mit Union verknüpfen, ich weis jedoch nicht, wie UNION
    darauf reagiert, zwei völlig unterschiedliche Zeilentypen (einen mit
    nur deinem Countfeld, und einen mit deinen Daten) zu verknüpfen.

    Oder hab ich da was falsch verstanden und das ist gar nicht das
    Problem sondern nur, das deine erste Abfrage Syntaxfehler hat?

    Gruss Daniela

    1. Hallo,

      danke für deine Antwort. Nachdem ich das Order by rausgeschmissen hatte, läuft es.

      Odium

  2. Hi,
    schreib doch einfach Dein Statement mit Deiner Where-Bedingung...
    in rs_c.recordcount hast Du dann das gewünschte ERgebnis stehen.
    Gruss
    Christian

    Hallo,

    hab da ein kleines Problem.

    Um die Anzahl der ausgewählten datensätze zu beginn der seite anzeigen zu können tue ich dies:

    rs_c = cn.Execute("SELECT COUNT(*) FROM tblEintraege")

    das bringt mir auch eine zahl, aber natürlich die gesamtanzahl der datensätze in der db (MS SQL-Server 7)

    die wirkliche anzahl ist aber geringer, da das auslesende sql-statment mit einer umfangreichen WHERE - Klausel ausgestattet ist.
    wenn ich diese where-klausel in die obere abfrage einbaue läuft aber gar nichts mehr...:

    Microsoft OLE DB Provider for ODBC Drivers- Fehler '80040e14'

    [Microsoft][ODBC SQL Server Driver][SQL Server]Spaltenname 'tblEintraege.bereich' ist in der ORDER BY-Klausel ungültig, da er nicht in einer Aggregatfunktion enthalten und keine GROUP BY-Klausel vorhanden ist.

    auch die betreffenden felder statt des * einzutragen bringt einen syntaxfehler...obwohl alles korrekt aussieht

    was ist zu tun?
    ich muss halt die suchtreffer am anfang der seite anzeigen können, um die suchergebnisse auf mehrere seiten zu verteilen...
    stimmt es eigenlich das die sql-syntax des ms-sql server keine limit anweisung kennt?
    das ist zwar nicht sehr schön, kann man aber umgehen...

    Danke

    Odium

    1. Hallo,

      schreib doch einfach Dein Statement mit Deiner Where-Bedingung...
      in rs_c.recordcount hast Du dann das gewünschte ERgebnis stehen.

      das geht aber auch nur, wenn ich den datensatzcursor entsprechend vorbereite, dazu hatte ich mal was gelesen, aber die variable blieb trotzdem leer bzw. war immer -1

      Naja...

      jetzt gehts ja

      Odium

    2. Hi Christian,

      schreib doch einfach Dein Statement mit Deiner
      Where-Bedingung... in rs_c.recordcount hast Du
      dann das gewünschte ERgebnis stehen.

      das ist aber hochgradig inperformant, weil die Datenbank dann sämtliche angeforderten Felder für die Abholung bereit stellen muß - selbst wenn diese Abholung durch die ASP-Anwendung dann nie erfolgt.

      SELECT COUNT(*) ist für das RDBMS viel weniger Arbeit, also viel weniger Last für die Maschine.

      Viele Grüße
            Michael