Recentemente sto adottando query che si basano sulla creazione di tabelle temporanee per la paginazione dei dati con MSSQL (anche versione 2000) ispirato da articoli che descrivono dettagliatamente (pro/contro e alternative) la tecnica. Per maggiori informazioni rimando a "Over the TOP" di Itzik Ben-Gan. Un esempio è quella che segue, una query che tornerà i dati dall'elemento 21 al 40.
SELECT TOP 40 IDENTITY(int, 1, 1) as pageIndex, *
INTO #tPaging FROM Products
WHERE productTypeId = 1
ORDER BY Name ASC;
SELECT * FROM #tPaging WHERE pageIndex >= 21;
DROP TABLE #tPaging
La filosofia della query è quella di caricare una tabella temporanea con un subset di dati contrassegnati da un campo autocontatore che numera le varie righe... campo che sarà poi un valido discriminante per il nostro intento. Ovviamente sto escludento la possibilità di usare un eventuale campo autocontante incluso bydesgign nella tabella di partenza in quanto passibile di buchi dovuti a cancellazioni. La presenza di campi autocontanti nell tabella di origine potrebbero inoltre dare problemi nella creazione della tabella temporanea. L'errore che è capitato a me è "Cannot add identity column, using the SELECT INTO statement, to table '#tPaging', which already has column 'ID' that inherits the identity property."
Come possiamo ovviare al problema? In primis rinunciando all'uso dello "*"... che poi è comuqnue sempre buona cosa... oltre al fatto che fareste felici il vostro DBA :-p Ecco quindi come potremmo traformare la nostra query: forzare una _dummy_ convesione della colonna incriminata... in modo da far perder la sua natura di IDENTITY - se così possiamo dire - ...
SELECT TOP 40 IDENTITY(int, 1, 1) as pageIndex,
CONVERT(INT, [ID]), Name, productTypeId <, ... fields list>
INTO #tPaging FROM Products
WHERE productTypeId = 1
ORDER BY Name ASC;
SELECT * FROM #tPaging WHERE pageIndex >= 21;
DROP TABLE #tPaging
Yawn... che sonno... :O Buona paginazione a tutti! :-D
posted @ venerdì 23 dicembre 2005 01:10