Eine beliebte Frage mit unzähligen Antworten. Meine Lieblingsantwort darauf ist, dies in der Präsentationsschicht seiner Anwendung zu machen. IMHO ist dies Aufgabe des Clients, nicht des Servers. Wenn es aber unbedingt in T-SQL gemacht werden soll, kann man folgendes machen:
USE PUBS
GO
SELECT
(
SELECT COUNT(*)
FROM Authors
WHERE au_id <= A.au_id
) AS Lfd_Nr
, au_lname, au_fname
FROM
Authors AS A
ORDER BY
Lfd_Nr
GO
Lfd_Nr au_lname au_fname
----------- ---------------------------------------- --------------------
1 Hello World Johnson
2 Green Marjorie
3 Carson Cheryl
4 O'Leary Michael
5 Straight Dean
6 Smith Meander
7 Bennet Abraham
8 Dull Ann
9 Gringlesby Burt
10 Locksley Charlene
11 Greene Morningstar
12 Blotchet-Halls Reginald
13 Yokomoto Akiko
14 del Castillo Innes
15 DeFrance Michel
16 Stringer Dirk
17 MacFeather Stearns
18 Karsen Livia
19 Panteley Sylvia
20 Hunter Sheryl
21 McBadden Heather
22 Ringer Anne
23 Ringer Albert
(23 row(s) affected)
Bei umfangreichen Resultsets kann die obige Methode schon mal einige Zeit in Anspruch nehmen. Ist also nur bedingt empfehlenswert. Eine Alternative ist vielleicht die Verwendung der IDENTITY Funktion zusammen mit einer temporären Tabelle, so wie hier:
SELECT
IDENTITY(INT,1,1) AS Lfd_Nr
, au_lname
, au_fname
INTO #authors
FROM authors
ORDER BY au_id
SELECT *
FROM #authors
ORDER BY Lfd_Nr
DROP TABLE #authors
Lfd_Nr au_lname au_fname
----------- ---------------------------------------- --------------------
1 Hello World Johnson
2 Green Marjorie
3 Carson Cheryl
4 O'Leary Michael
5 Straight Dean
6 Smith Meander
7 Bennet Abraham
8 Dull Ann
9 Gringlesby Burt
10 Locksley Charlene
11 Greene Morningstar
12 Blotchet-Halls Reginald
13 Yokomoto Akiko
14 del Castillo Innes
15 DeFrance Michel
16 Stringer Dirk
17 MacFeather Stearns
18 Karsen Livia
19 Panteley Sylvia
20 Hunter Sheryl
21 McBadden Heather
22 Ringer Anne
23 Ringer Albert
(23 row(s) affected)
In SQL Server 2005 ist dies übrigens einfacher durch die Implementierung von ROW_NUMBER().
Vor einiger Zeit habe ich auf SQLTeam.com etwas sehr Nützliches entdeckt. Die Generierung einer sequentiellen Nummerierung mit Hilfe eines einzelnen UPDATE Statements.
SET NOCOUNT ON
CREATE TABLE SEQ_T
(
col1 INT DEFAULT 0
)
DECLARE @SEQUENCE INT
SET @SEQUENCE = 0
WHILE @SEQUENCE <=10
BEGIN
INSERT INTO SEQ_T DEFAULT VALUES
SET @SEQUENCE = @SEQUENCE+1
END
SET NOCOUNT OFF
SELECT * FROM SEQ_T
SET @SEQUENCE = 0
UPDATE SEQ_T SET @SEQUENCE = col1 = @SEQUENCE + 1
SELECT * FROM SEQ_T
DROP TABLE SEQ_T
col1
-----------
0
0
0
0
0
0
0
0
0
0
0
(11 row(s) affected)
(11 row(s) affected)
col1
-----------
1
2
3
4
5
6
7
8
9
10
11
(11 row(s) affected)
...einziger Nachteil ist, dass man nicht explizit in der Lage ist, die Sortierung vorzugeben.