در بسیاری از مواقع احتیاج داریم که به هر سطر از نتیجه ی Query یک شماره بدهیم. بطور مثال در تکنیک Paging (صفحه بندی) این موضوع الازمی است.
نرم افزار SQL Server 2005 یکسری توابعی به نام Ranking را معرفی کرد که این کار را به سادگی و زیبایی انجام می دهد. در ادامه این موضوع در نسخه ی 2000 و 2005 مورد بررسی قرار خواهد گرفت.
نسخه ی 2000
برای اینکه درک مساله ساده تر شود از یک مثال استفاده خواهد شد. ابتدا یک متغیر جدول با یک ستون تعریف کرده و تعدادی سطر در آن انتشار داده می شود (توجه کنید که از آخرین Syntax نرم افزار SQL Server استفاده شده است)
DECLARE @t TABLE (i INT);
INSERT @t VALUES (1), (3), (4), (8);
SELECT * FROM @t;
/*
i
---
1
3
4
8
*/
روش اول: تابع IDENTITY INTO
SELECT *, IDENTITY (INT, 1, 1) AS ID
INTO #temp
FROM @t;
SELECT *
FROM #temp;
/*
i ID
----------- -----------
1 1
3 2
4 3
8 4
*/
این تابع که همراه با ماده ی INTO استفاده می شود به نتیجه ی کوئری یک ستون IDENTITY اضافه کرده و نتیجه ی حاصل را در یک جدول جدید درج می کند. البته زمانی که از این روش به همراه ماده ی ORDER BY استفاده می کنیم تظمینی برای تولید ID های منظم و مرتب وجود نخواهد داشت. یعنی سطر اول ممکن است مقداری متفاوت با 1 داشته باشد و به همین ترتیب. می توانید به این مقاله ی KB مراجعه کنید.
روش دوم: خصیصه ی IDENTITY
DECLARE @table TABLE (i INT, ID INT IDENTITY);
INSERT INTO @table SELECT * FROM @t
SELECT * FROM @table
/*
i ID
--- ----
1 1
3 2
4 3
8 4
*/
ابتدا یک متغیر جدولی با ساختار جدول اصلی و یک ستون اضافی با خصیصه ی IDENTITY تعریف نموده سپس با کمک دستور INSERT SELECT تمام سطرها جدول را در متغیر جدولی درج می کنیم.
نسخه ی 2005/2008
SELECT *, ID = ROW_NUMBER() OVER(ORDER BY i ASC)
FROM @t
تابع ROW_NUMBER بدون PARTITION به هر سطر از جدول یک شماره که از 1 آغاز شده و یکی یکی افزایش پیدا می کند خواهد داد. ترتیب نیز بر اساس صعودی ستون i خواهد بود.