Benutzer mit den meisten Antworten
Wiederverwendung eines Statements in einer Prozedur

Frage
-
Hallo,
ich habe ein komplexeres SELECT-Statement in einer Prozedur, dass ich gerne mehrmals in der Prozedur verwenden würde.
ALTER PROCEDURE [dbo].[test] @Begin Datetime, @Ende Datetime, @PageSize int, @Page int, @TotalRows int OUTPUT AS BEGIN WITH temp AS ( SELECT ROW_NUMBER() OVER (ORDER BY Name ASC) AS row, Spalte1, Spalte2, Spalte3 FROM tabelle1 WHERE datum>=@Begin AND datum<=@Ende GROUP BY Spalte1 ) SELECT * FROM temp WHERE row BETWEEN (@Page-1)*@PageSize+1 AND @Page*@PageSize SELECT @TotalRows=COUNT(*) FROM temp END
Allerdings funktioniert das so wie oben geschrieben nicht. 'temp' wird beim letzten SELECT-Aufruf nicht mehr erkannt.Wie kann man ein SELECT-Statement in einer Prozedur mehrmals verwenden, ohne eine View davon erstellen zu müssen?
Habt vielen Dank
Konrad
Antworten
-
> Wie kann man ein SELECT-Statement in einer Prozedur mehrmals verwenden, ohne eine View davon erstellen zu müssen?
Gar nicht, du kannst lediglich das Ergebnis materialisieren. Entweder in eine temporäre Tabelle oder eine Tabellenvariable.
Allerdings gehts in deinem Fall einfacher:
USE AdventureWorks2008R2 ; GO DECLARE @Begin DATE = '2001-01-01' , @Ende DATE = '2003-12-31' , @PageSize INT = 10 , @Page INT = 2 , @TotalRows INT ; WITH Ordered AS ( SELECT ROW_NUMBER() OVER ( ORDER BY LastName ASC, FirstName ASC ) AS RN , COUNT(*) OVER ( ) AS Cnt , * FROM Person.Person WHERE ModifiedDate >= @Begin AND ModifiedDate <= @Ende ) SELECT * FROM Ordered WHERE RN BETWEEN ( @Page - 1 ) * @PageSize + 1 AND @Page * @PageSize ;
Du musst lediglich den Wert von Cnt zurückgeben.
Microsoft MVP Office Access
https://mvp.support.microsoft.com/profile/Stefan.Hoffmann- Als Antwort vorgeschlagen Falk Krahl Dienstag, 5. Juli 2011 09:34
- Als Antwort markiert KonradMD Dienstag, 5. Juli 2011 09:34
Alle Antworten
-
> Wie kann man ein SELECT-Statement in einer Prozedur mehrmals verwenden, ohne eine View davon erstellen zu müssen?
Gar nicht, du kannst lediglich das Ergebnis materialisieren. Entweder in eine temporäre Tabelle oder eine Tabellenvariable.
Allerdings gehts in deinem Fall einfacher:
USE AdventureWorks2008R2 ; GO DECLARE @Begin DATE = '2001-01-01' , @Ende DATE = '2003-12-31' , @PageSize INT = 10 , @Page INT = 2 , @TotalRows INT ; WITH Ordered AS ( SELECT ROW_NUMBER() OVER ( ORDER BY LastName ASC, FirstName ASC ) AS RN , COUNT(*) OVER ( ) AS Cnt , * FROM Person.Person WHERE ModifiedDate >= @Begin AND ModifiedDate <= @Ende ) SELECT * FROM Ordered WHERE RN BETWEEN ( @Page - 1 ) * @PageSize + 1 AND @Page * @PageSize ;
Du musst lediglich den Wert von Cnt zurückgeben.
Microsoft MVP Office Access
https://mvp.support.microsoft.com/profile/Stefan.Hoffmann- Als Antwort vorgeschlagen Falk Krahl Dienstag, 5. Juli 2011 09:34
- Als Antwort markiert KonradMD Dienstag, 5. Juli 2011 09:34
-
Danke das hilft schon mal weiter.
Damit hab ich ja die Zeilenzahl zumindest schonmal - wenn auch nicht als lokale Variable die ich extra zurückgeben kann. Leider geht ja ein
SELECT *,@TotalRows=Cnt FROM Ordered
Aber gut, ein erster Behelf ist es allemal :)