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

«dicembre»
domlunmarmergiovensab
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567