SQL, paginazione con tabelle temporanee e campi IDENTITY

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

Print

Comments on this entry:

# re: SQL, paginazione con tabelle temporanee e campi IDENTITY

Left by Francesco Notaril at 24/12/2005 11:52
Gravatar
Consiglio la lettura di questo ottimo articolo per affrontare non sommariamente le casistiche di paginazione: http://www.devleap.com/Articolo3723.devleap
Comments have been closed on this topic.
«aprile»
domlunmarmergiovensab
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011