Domanda

Mi è stato assegnato il compito di refactoring di una stored procedure esistente in modo che i risultati vengano impaginati. Il server SQL è SQL 2000, quindi non posso usare il metodo di paginazione ROW_NUMBER. Il proc memorizzato è già abbastanza complesso, costruendo pezzi di una grande istruzione sql insieme prima di fare uno sp_executesql e ha varie opzioni di ordinamento disponibili.

Il il primo risultato su google sembra un buon metodo ma io pensa che l'esempio sia sbagliato in quanto il secondo ordinamento deve essere invertito e il caso in cui l'inizio è inferiore alla lunghezza della pagina si rompe. Anche il secondo esempio in quella pagina sembra un buon metodo ma l'SP sta prendendo un pageNumber piuttosto che il record di avvio. E l'intera cosa della tabella temporanea sembra che sarebbe un drenaggio delle prestazioni.

Sto facendo progressi seguendo questa strada, ma sembra lento e confuso e devo fare un bel po 'di metodi di SOSTITUZIONE sull'ordinamento per farlo emergere nel modo giusto.

Ci sono altre tecniche più semplici che mi mancano?

È stato utile?

Soluzione 5

Dopo aver giocato con questo per un po 'sembra esserci solo un modo per farlo davvero (usando i parametri Start e Length) e questo è con la tabella temporanea.

La mia soluzione finale era di non utilizzare il parametro @start e invece utilizzare un parametro @page e quindi utilizzare

    SET @sql = @sql + N'

    SELECT * FROM
    (
    SELECT TOP ' + Cast( @length as varchar) + N' * FROM 
            (
            SELECT TOP ' + Cast( @page*@length as varchar) + N'
                 field1,
                 field2 
                 From Table1
                 order by field1 ASC
            )  as Result   
            Order by Field1 DESC
     )  as Result
     Order by Field 1 ASC'

La query originale era molto più complessa di quanto mostrato qui e l'ordine di è stato ordinato su almeno 3 campi e determinato da una lunga clausola CASE, che mi ha richiesto di utilizzare una serie di funzioni REPLACE per ottenere i campi nel modo giusto ordine.

Altri suggerimenti

Esistono due risposte conformi a SQL Server 2000 in questo StackOverflow domanda - salta quella accettata, che è solo per il 2005:

No, temo di no - SQL Server 2000 non ha nessuna delle chicche del 2005 come Common Table Expression (CTE) e simili ..... il metodo descritto nel link di Google sembra essere un modo per andare.

Marc

Dai anche un'occhiata qui http://database.aspfaq.com/ Database / how-do-i-page-through-a-recordset.html

scorri verso il basso fino a Metodi di procedura memorizzata

A seconda dell'architettura dell'applicazione (e della quantità di dati, della struttura, del carico del server DB, ecc.) è possibile utilizzare il livello di accesso al DB per il paging.

Ad esempio, con ADO è possibile definire una dimensione di pagina sull'oggetto set di record (DataSet in ADO.NET) ed eseguire il paging sul client. ADO classico ti consente persino di utilizzare un cursore sul lato server, anche se non so se si ridimensiona bene (penso che sia stato rimosso del tutto in ADO.NET).

Documentazione MSDN: Paging tramite un risultato di query (ADO.NET)

Usiamo variazioni su questa query da diversi anni. Questo esempio fornisce articoli da 50.000 a 50.300.

select top 300 
  Items.*
from Items
where 
  Items.CustomerId = 1234 AND
  Items.Active = 1 AND
  Items.Id not in
  ( 
    select top 50000 Items.Id
    from Items
    where 
      Items.CustomerId = 1234 AND
      Items.Active = 1
    order by Items.id
  )
order by Items.Id
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top