چگونه عملیات صفحه بندی (paging) را در sql server انجام دهیم؟

در خیلی مواقع ملاحظه میشود که برای نمایش تعدادی از رکوردهای یک جدول در پایگاه داده کل مقادیر موجود درآن توسط یک دستور select به دست می‌آید و صفحه‌بندی خروجی به کنترلهای موجود سپرده میشود. اگر پایگاه داده ما دارای تعداد زیادی رکورد باشد آن موقع است که ما دچار مشکل میشویم. فرض کنید به طور همزمان ۵ نفر (که تعداد زیادی نیستند) از برنامه ما که شامل ۱۰۰۰۰۰ سطر داده میباشد استفاده کنند  و در هر صفحه ما ۱۰ رکورد نمایش داده شود و صفحه‌بندی ما از نوع معقولی نباشد در این صورت به جای اینکه ما با ۵×۱۰ رکورد داده را بارگزاری کنیم، ۵×۱۰۰۰۰۰ رکورد یعنی ۵۰۰۰۰۰ رکورد را برای به دست آوردن ۵۰ رکورد بارگزاری میکنیم. در زیر روشی شرح داده میشود که سربار اضافه از روی برنامه و سرورهای مربوطه حذف شود. به stored procedure و توضیحات مربوط به آن توجه فرمایید :


CREATE PROCEDURE sp_PagedItems
    (
     @Page int,
     @RecsPerPage int
    )
AS

-- We don't want to return the # of rows inserted
-- into our temporary table, so turn NOCOUNT ON
SET NOCOUNT ON


--Create a temporary table
CREATE TABLE #TempItems
(
    ID int IDENTITY,
    Name varchar(50),
    Price currency
)


-- Insert the rows from tblItems into the temp. table
INSERT INTO #TempItems (Name, Price)
SELECT Name,Price FROM tblItem ORDER BY Price

-- Find out the first and last record we want
DECLARE @FirstRec int, @LastRec int
SELECT @FirstRec = (@Page - 1) * @RecsPerPage
SELECT @LastRec = (@Page * @RecsPerPage + 1)

-- Now, return the set of paged records, plus, an indiciation of we
-- have more records or not!
SELECT *,
       MoreRecords =
    (
     SELECT COUNT(*)
     FROM #TempItems TI
     WHERE TI.ID >= @LastRec
    )
FROM #TempItems
WHERE ID > @FirstRec AND ID < @LastRec


-- Turn NOCOUNT back OFF
SET NOCOUNT OFF

در این کد دو پارامتر از نوع integer تعریف میکنیم. اول پارامتر @Page که مربوط به شماره صفحه‌ای میباشد که قصد دارید آن را بارگزاری نمایید. دومین پارامتر با نام @RecsPerPage تعداد رکوردهایی است که هر بار میخواهید بارگزاری شوند مثلا اگر میخواهید هر بار ۱۵ عدد از رکوردها را نمایش دهید این مقدار را باید برابر ۱۵ قرار دهیم.در مرحله بعد یک جدول موقت با نام #TempItems ساخته شده است که به طور موقت مقادیری را در حافظه نگه میدارد و هیچ فضای فیزیکی روی هارد دیسک اشغال نمیکند. نکته کلیدی که جلوتر از آن استفاده شده ستون با نام ID است که از نوع auto-increment است و روی جدول موقت تعریف شده است. این ستون شناسه هر سطر را در خود نگه میدارد که به صورت اتوماتیک بالا میرود و جزء لاینفکی از این نوع paging میباشد. پس از آن جدول موقت را توسط رکوردهای جدول واقعی با نام tblItem توسط دستور select پر میکنیم.
در مرحله بعد شماره اولین و آخرین سطر مورد نظر را بر اساس پارامترهای ورودی محاسبه کرده و در متغیرهای @FirstRec و @LastRec بریزیم.
برای استفاده از این کد فقط کافیست که پارامترهای ورودی را مقداردهی نمایید. مثلا اگر میخواهید در یک کنترل Grid از آن استفاده کنید باید ابتدا یک کوئری داشته باشید که تعداد کل سطرها را به شما بدهد و بر اساس این مقدار تعداد صفحات مورد نظر را به دست آورید. پس از آن با کلیک روی هر کدام از شماره صفحات آن را به عنوان مقدار به پارامتر مورد نظر بفرستید و از آن لذت ببرید.

/ 4 نظر / 271 بازدید
سایت 118

درود بر شما سايت جامع نيازمنديهاي 118 را به شما معرفي مي نماييم . http://www.site118.com شامل بخشهاي ويژه دانلود رايگان کتب و مقالات معتبر فارسي و انگليسي ؛ آموزش زبان ،‌ با بيش از 600 کتاب ... مجلات معتبر دنيا به صورت PDF کاملا" تخصص با بخشهاي علمي science ، کامپيوتر و گرافيک و مولتي مديا و دکوراسيون و ... بخش ويژه کاريابي که مي توانيد آگهي هاي خود را به صورت رايگان درج نماييد . در صورتي که امکان دانلود نداريد مي توانيد کتب مورد نظر خود را نيز سفارش دهيد تا از طريق پست بر روي سي دي براي شما ارسال گردد . همه چيز در site 118.com با عضويت آسان ،‌حتما" عضو شويد .

محمد جواد شخصي

با عرض سلام و خسته نباشيد به شما وب سايت قنگي ، و پر محتوايي داريد از اينكه وارد وب سايت شما شدم خيلي خوشحال شدم اميدوارم بازهم به اين كارت ادامه بدي دوست عزيز اسم من محمد جواد شخصي اگر دوست داشتيد وبلاگ من رو با نام پايگاه آموزش ويژوال بيسيك لينك كن من در اين وبلاگ به آموزش ويژوال بيسيك و ويژوال بيسيك پايگاه داده فعاليت مي كنم اميدوارم به وبلاگ من هم سري بزني خيلي دوست دارم با هم بيشتر فعاليت كنيم.سعي مي كنم حداقل هر هفته دو سه باري به وبلاگت سر بزنم تا ملاقات بعدي خدانگهدار. آدرس وبلاگ من : www.shakhsi7270.blogfa.com [ماچ][قلب]

امير

آقاي بابك زواري در سايت انجمن تخصصي دات نت يك راه حل خيلي ساده تر براي اينكار ارائه دادن لينكش اينجاست http://www.p2p.dotnetsource.com/Default.aspx?g=posts&t=328

بهتاش مرادی

دوست عزیز روش ارایه شده خیلی قدیمی است و برای یک بانک اطلاعاتی با تعداد کاربران همزمان زیاد اصلا مناسب نیست. از نسخه 2005 به بعد ویژگیهای جدیدی اضافه شده که براحتی کار فوق انجام پذیر است: declare @begin INT declare @end INT set @begin =12 set @end=22 select * from ( SELECT ROW_NUMBER() OVER (ORDER BY productid ASC) AS ROWID, * FROM production.product )x where rowid between @begin and @end