none
Wiederverwendung eines Statements in einer Prozedur RRS feed

  • 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

    Dienstag, 5. Juli 2011 08:22

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
    Dienstag, 5. Juli 2011 08:39
    Moderator

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
    Dienstag, 5. Juli 2011 08:39
    Moderator
  • 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 :)

     

    Dienstag, 5. Juli 2011 09:01