![]() |
Datenbank: MSSQL • Version: 2005 • Zugriff über: ADO
10Records vor- und zurückblättern (Paging)
ich habe dummerweise sehr viel Zeit verbracht ein "10Records vor- und zurückblättern" mit einem SQLCursor zu lösen
(war leider sehr kompliziert und die Performance schlecht) tja - heute habe ich folgendes in MS Technet gefunden:
SQL-Code:
Link:
USE AdventureWorks;
GO WITH OrderedOrders AS ( SELECT SalesOrderID, OrderDate, ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber' FROM Sales.SalesOrderHeader ) SELECT * FROM OrderedOrders WHERE RowNumber BETWEEN 50 AND 60; ![]() so einfach und so schnell und da dies vllcht noch nicht alle im DP kennen wollt ichs hier noch posten |
Re: 10Records vor- und zurückblättern
zufrüh gefreut... sooo ein shit... :wall:
ADO versteht kein WITH Statement... oder kennt bitte jemand einen Trick? |
Re: 10Records vor- und zurückblättern
Wieso soll ADO das verstehen? Ich kann doch 'Halmackenreuther' zum SQL-Server schicken ... :gruebel:
Egal, mach ne UDF draus |
Re: 10Records vor- und zurückblättern
Hier hab ich noch was dazu gefunden:
![]() |
Re: 10Records vor- und zurückblättern
Vielen Dank für die Tipps!
leider ist das von mir aufgeführte SQLBeispiel nur ein stark vereinfachtes Beispiel und sollte einen Ansatz bieten Mein SQL Statement ist sehr viel komplexer - meine Tabelle (> 100'000 Records und stark wachsend) viel grösser und deshalb: - geht eine UserDefinierteFunction (UDF) als auch eine Procedures auf dem SQL Server nicht (war mein erster Ansatz mit dem ich sehr viel Zeit verbraten habe) - das Beispiel der mehrstufigen Begrenzung auch nicht möglich
SQL-Code:
PS: geht bei mir ehh nichtSELECT TOP 50 name, value FROM ( SELECT TOP 100 name, value FROM tab ORDER BY value DESC) ORDER BY value ASC; ABER - ich habe einen naja "eleganten" Umweg (und vllcht wird der ja noch ein paar anderen dienen, ich profitiere oft von den Ideen hier in der DP, so möcht ich auch wieder mal was beitragen - mein Tipp:) man erstelle auf dem SQLServer folgende Procedure:
SQL-Code:
und anschliessen kann man die Procedure EXECSQLDirect mit dem ersten Beispielcode als Parameter @SQLStatement übergeben...
CREATE PROCEDURE [ExecSQLDirect]
@SQLStatement varchar(MAX) AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; exec(@SQLStatement) END cool oder? tja - wer lange sucht... wird langsam schlau... PS: und so kann übrigens jedes für den SQLServer gültige SQLStatement, bei welchem die ADO's eine exception auslösen würden, ausgeführt werden :wink: |
Re: 10Records vor- und zurückblättern (Paging)
Also, wenn Du durch eine lange Tabelle blättern willst, dann :
Erstelle einen CLUSTERED(!!!) INDEX auf der Spalte, nach der sortiert werden soll. Wir nennen die jetzt mal 'SEQ' (für Sequenz). Dann: In Delphi deklarierst du zwei Variablen: 'TopSeq' und 'BottomSeq'. So, jetzt der Code: Init: 'Select Top 10 * from MyTable Order by SEQ' Du bekommst maximal 10 Zeilen. Der Wert 'SEQ' der 1.Zeile kommt in TopSeq, der der letzten Zeile in 'BottomSeq' Nächste Seite laden: 'Select Top 10 * from MyTable Where SEQ > :BottomSeq order by SEQ' Du bekommst maximal 10 Zeilen. Der Wert 'SEQ' der 1.Zeile kommt in TopSeq, der der letzten Zeile in 'BottomSeq' Vorherige Seite laden: 'select * from (Select Top 10 * from MyTable Where SEQ > :TopSeq order by SEQ Desc) x order by SEQ' Du bekommst maximal 10 Zeilen. Der Wert 'SEQ' der 1.Zeile kommt in TopSeq, der der letzten Zeile in 'BottomSeq' Der Trick ist der Clustered Index, denn dann verbraucht die Sortierung keine Zeit (die Daten sind bereits sortiert abgelegt). Du wirst bei dieser Lösung keine Verzögerung bemerken, egal wie groß die Tabelle ist. Unter SQL 2005 gehts vielleicht auch noch einfacher, aber so hab ich mir seit 10 Jahren beholfen und es funzt sehr gut. Die Frage, die Du dir stellen solltest, lautet aber: Zitat:
|
Re: 10Records vor- und zurückblättern (Paging)
thx to alzaimar
aufgrund von deinem bsp weiss ich dödel jetzt endlich wieso folgendes NICHT geht:
SQL-Code:
see:
SELECT TOP 50 name, value
FROM ( SELECT TOP 100 name, value FROM tab ORDER BY value DESC) ORDER BY value ASC; ![]() sondern man muss "aliasen" :wall: (oder wie hiess das schonwieder)! so muss es heissen:
SQL-Code:
dein tipp vom clustered index kann ich (glaub ich) nicht anwenden, denn ich habe für die tabelle schon einen clustered index für den PK und
SELECT TOP 50 name, value
FROM ( SELECT TOP 100 name, value FROM tab ORDER BY value DESC) MYALIAS ORDER BY value ASC; leider weiss nicht wie ich einen zweiten gruppierten clustered index machen kann ich erhalte immer Zitat:
|
Re: 10Records vor- und zurückblättern (Paging)
Hallo,
weil die Daten bei einem clustered index physisch sequentiell abgespeichert werden, kannst du natürlich nur einen solchen Index pro Tabelle haben. In der Regel ist der PK ein mieser Kandidat für den clustered index. Die eingedeutschte Fehlermeldung ist insofern irreführend, als es einen weiteren clustered index nie geben kann. Die vorgeschlagene Maßnahme ist aber richtig: Erstelle den Index über den PK neu als non-clustered, dann kannst du einen clustered index über ein Feld legen, das besser geeignet ist. Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz