Late this evening I stumbled across a post where OP wanted to get all IDENTITY values for the latest INSERT statement, and correctly OP stated that SCOPE_IDENTITY() only returns last IDENTITY value of the batch.
Well, since OUTPUT is not an option for SQL Server 2000, and if you don't want to include temp tables or other means, this is one way how to solve this issue.
The algorithm relies in implicit transaction; if SPID 60 inserts 5000 records exactly the same time as SPID 61 inserts another 7500 records, the identity values for each spid doesn't get interleaved.
CREATE TABLE #Sample
(
ID INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
Dummy INT NOT NULL,
INSERT #Sample
SELECT 1, 1
SELECT SCOPE_IDENTITY() - IDENT_INCR('#Sample') * (@@ROWCOUNT - 1) AS FirstID,
SCOPE_IDENTITY() AS LastID,
IDENT_INCR('#Sample') AS Increment
INSERT #Sample
SELECT 2, 2 UNION ALL
SELECT 3, 2 UNION ALL
SELECT 4, 2
SELECT SCOPE_IDENTITY() - IDENT_INCR('#Sample') * (@@ROWCOUNT - 1) AS FirstID,
SCOPE_IDENTITY() AS LastID,
IDENT_INCR('#Sample') AS Increment
INSERT #Sample
SELECT 5, 3 UNION ALL
SELECT 6, 3 UNION ALL
SELECT 7, 3 UNION ALL
SELECT 8, 3 UNION ALL
SELECT 9, 3
SELECT SCOPE_IDENTITY() - IDENT_INCR('#Sample') * (@@ROWCOUNT - 1) AS FirstID,
SCOPE_IDENTITY() AS LastID,
IDENT_INCR('#Sample') AS Increment
SELECT *
FROM #Sample
DROP TABLE #Sample