Sandro Bizioli


Chi sogna di giorno conosce molte cose che sfuggono a chi sogna soltanto di notte. (E.A.Poe)
Home Blogs | Home | Login | Contact | My Profile | RSS | About | Cerca

Numerare le righe di una tabella

Molto spesso mi è stato chiesto se fosse possibile visualizzare il numero progressivo di riga del resulset di una stored procedure o di una generica select.Facciamo un esempio molto banale:Sia data una tabella contenente due campi, codice e descrizione voglio ottenere un terzo campo contenente il numero progressivo delle righe:Codice, Descrizione, [NumRiga]Una prima soluzione potrebbe essere quella di aggiungere alla tabella un campo indentity con incremento automatico, in modo che tutte le righ 
Leggi tutto il post...
Categoria: SQL Server
mercoledì, 07 dic 2005 Ore. 13.43

Scrivi un commento

Nome:
Blog:
E-Mail:
(l'indirizzo e-mail non verrà pubblicato, consente di essere avvertiti quando arrivano nuovi commenti a questo Post)
Codice:
Corpo:
Cookie:

Commenti

Autore: LorenzoInviato il: 07 dic 2005 - 18.56
Ciao Sandro,

come giustamente hai illustrato nel tuo post, SQL Server 2000 non offre nativamente un sistema "comodo" per enumerare le righe restituire da una query.
SQL Server 2005 ci viene incontro offrendoci la funzione ROW_NUMBER ( ) che restituisce il numero sequenziale di una riga in una partizione di un result set, partendo da 1 per la prima riga di ogni partizione.
La clausola OVER(), obbligatoria, determina la partizione e l'ordinamento del rowset prima che la funzione associata venga applicata.

Vediamo un paio di esempi:

USE tempdb;
GO

/* Definisco la tabella dbo.myTable */
CREATE TABLE dbo.myTable(
Codice varchar(6) NOT NULL,
Descrizione varchar(25) NOT NULL
);
GO

/* La popolo */
SET NOCOUNT ON;
INSERT dbo.myTable VALUES('SQL2K', 'SQL Server 2000');
INSERT dbo.myTable VALUES('SQL2K5', 'SQL Server 2005');
INSERT dbo.myTable VALUES('VB6', 'Visual Basic 6');
INSERT dbo.myTable VALUES('VB2K5', 'Visual Basic 2005');
INSERT dbo.myTable VALUES('VB2K5E', 'Visual Basic 2005 Express');
SET NOCOUNT OFF;
GO

/* Query */
SELECT
Codice
, Descrizione
, ROW_NUMBER() OVER(ORDER BY Codice) AS 'Row Number'
FROM dbo.MyTable;
GO

/* Output:

Codice Descrizione Row Number
------ ------------------------- --------------------
SQL2K SQL Server 2000 1
SQL2K5 SQL Server 2005 2
VB2K5 Visual Basic 2005 3
VB2K5E Visual Basic 2005 Express 4
VB6 Visual Basic 6 5

(5 row(s) affected)

*/

/* Pulizia */
DROP TABLE dbo.myTable;


Questa volta definisco una partizione sulla colonna Codice:

/* Definisco la tabella dbo.myTable */
CREATE TABLE dbo.myTable(
Codice varchar(6) NOT NULL,
Descrizione varchar(25) NOT NULL
);
GO

/* La popolo */
SET NOCOUNT ON;
INSERT dbo.myTable VALUES('SQL', 'SQL Server 2000');
INSERT dbo.myTable VALUES('SQL', 'SQL Server 2005');
INSERT dbo.myTable VALUES('VB', 'Visual Basic 6');
INSERT dbo.myTable VALUES('VB', 'Visual Basic 2005');
INSERT dbo.myTable VALUES('VB', 'Visual Basic 2005 Express');
SET NOCOUNT OFF;
GO

/* Query */
SELECT
Codice
, Descrizione
, ROW_NUMBER() OVER(PARTITION BY Codice ORDER BY Codice) AS 'Row Number'
FROM dbo.MyTable;
GO

/* Output:

Codice Descrizione Row Number
------ ------------------------- --------------------
SQL SQL Server 2000 1
SQL SQL Server 2005 2
VB Visual Basic 6 1
VB Visual Basic 2005 2
VB Visual Basic 2005 Express 3

(5 row(s) affected)

*/

/* Pulizia */
DROP TABLE dbo.myTable;

Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003