حسین احمدی
بنیانگذار توسینسو و برنامه نویس و توسعه دهنده ارشد وب

معرفی انواع روشهای صفحه بندی یا Pagination در SQL Server

دوستان عزیزی که کار برنامه نویسی، چه تحت وب و چه تحت ویندوز را انجام می دهند، به طور حتم با مفهوم صفحه بندی اطلاعات آشنایی دارند. فرض کنید جدولی دارید با نام Orders که حدود 10000 رکورد در آن ثبت شده است. حال شما می بایست اطلاعات این جدول را در خروجی نمایش دهید. اما آیا هر 10 هزار رکورد را به صورت یکجا در خروجی می بایست نمایش داد؟

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

به طور حتم اینگونه نیست و باید از مکانیز صفحه بندی یا Pagination استفاده کرد. در SQL Server به دو روش می توان کار صفحه بندی را انجام داد. یکی استفاده از تابع ROW_NUMBER که جزو Ranking Function ها قرار میگیرند و دیگری استفاده از مکانیزم OFFSET و FETCH است که در این مطلب به نحوه استفاده از این دو روش می پردازیم.

استفاده از تابع ROW_NUMBER

بوسیله این تابع می توان به هر سطر یک عدد اختصاص داد و بعد با یک Query مجدد و بر اساس شماره سطر کار صفحه بندی را انجام داد. در این روش، در حقیقت باید از Query های تو در تو استفاده کنیم. ساختار تابع ROW_NUMBER به صورت زیر است:

ROW_NUMBER() OVER (ORDER BY {column-name} [ASC/DESC])

نحوه اجرای دستور ROW_NUMBER به این صورت است که ابتدا عملیات مرتبط سازی بر روی ستونی که نام آن را در قسمت column-name مشخص کردیم و به صورت صعودی یا نزولی (کلمات کلیدی ASC یا DESC) انجام شده و به هر ستون یک شماره اختصاص داده می شود. حال می توان بر اساس این شما کار فیلتر اطلاعات را انجام داد. فرض کنیم که هر صفحه شامل 30 رکورد بوده و می خواهیم اطلاعات را در صفحه 35 ام را بدست آوریم. مثال را بر روی جدولی فرضی با نام Orders میزنیم:

declare @page int;
set @page = 35;
SELECT * FROM
	(select
		ROW_NUMBER() OVER (ORDER BY OrderDate DESC) [Rank],
		*
	FROM Orders) tbl
WHERE tbl.[Rank] BETWEEN ((@page-1)*30)+1 AND ((((@page-1)*30)) + 30)

در مثال بالا، اطلاعات بر اساس ستون OrderDate مرتب شده و سپس به هر سطر یک شماره اختصاص داده می شود. سپس با یک Query ای دیگر اطلاعات بر اساس شماره صفحه فیلتر می شوند. کافیست مقدار متغیر page بر اساس شماره صفحه تغییر کند.

استفاده از روش OFFSET و FETCH

این روش کار را نسبت به ROW_NUMBER ساده تر می کند. صفحه بندی بالا، بر اساس روش OFFSET و FETCH به صورت زیر نوشته می شود:

declare @page int;
set @page = 2;
select * from Orders
order by OrderDate DESC
offset (@page-1) * 30 ROWS fetch next 30 ROWS ONLY

همانطور که مشاهده می کنید، Query نوشته شده بسیار ساده تر از روش ROW_NUMBER می باشد. شما ابتدا Query را با عبارت ORDER BY مرتب سازی کرده، سپس با عبارت OFFSET مشخص می کنید که در نتیجه Query از چند سطر باید صرفنظر شود، سپس بوسیله عبارت fetch تعداد سطر های مورد نظر را برای دریافت مشخص می کنید. این قابلیت از نسخه 2012 به SQL Server اضافه شده و کار صفحه بندی نتایج Query ها را بسیار ساده تر می کند.


حسین احمدی
حسین احمدی

بنیانگذار توسینسو و برنامه نویس و توسعه دهنده ارشد وب

حسین احمدی ، بنیانگذار TOSINSO ، توسعه دهنده وب و برنامه نویس ، بیش از 12 سال سابقه فعالیت حرفه ای در سطح کلان ، مشاور ، مدیر پروژه و مدرس نهادهای مالی و اعتباری ، تخصص در پلتفرم دات نت و زبان سی شارپ ، طراحی و توسعه وب ، امنیت نرم افزار ، تحلیل سیستم های اطلاعاتی و داده کاوی ...

نظرات