خانه > Persian Contents, SQL Server > چگونه عملیات صفحه بندی (paging) را در sql server انجام دهیم؟

چگونه عملیات صفحه بندی (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 از آن استفاده کنید باید ابتدا یک کوئری داشته باشید که تعداد کل سطرها را به شما بدهد و بر اساس این مقدار تعداد صفحات مورد نظر را به دست آورید. پس از آن با کلیک روی هر کدام از شماره صفحات آن را به عنوان مقدار به پارامتر مورد نظر بفرستید و از آن لذت ببرید.

دسته‌ها:Persian Contents, SQL Server
  1. سایت 118
    ژوئیه 14, 2009 در 1:17 ب.ظ.

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

  2. محمد جواد شخصي
    ژوئیه 14, 2009 در 1:51 ب.ظ.

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

  3. امير
    اوت 20, 2009 در 11:54 ق.ظ.

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

  4. بهتاش مرادی
    آوریل 13, 2010 در 2:30 ب.ظ.

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

  5. فوریه 6, 2011 در 4:12 ب.ظ.

    سلام دوست من من متوجه حرفات نشدم اگه میشه بیاین به وبلاگم وبه مطالب زیبا وخواندنی درباره ی امام زمان برین وبهم بگین که چطور پاییت مطالب قدیمی تر داره را کاری کنم که صفحه بندی بشه در ظمن بهم بگو با چه اسمی لینکت کنمhttp://komeil74.blogfa.com

    • فوریه 6, 2011 در 4:24 ب.ظ.

      سلام دوست عزیز
      فکر کنم دچار سوء تفاهم شدید. منظور از صفحه‌بندی، صفحه‌بندی مطالب وبلاگ نیست بلکه مربوط به صفحه‌بندی مطالب در نرم‌افزارهایی است که خودتان می‌نویسید.

  6. فوریه 6, 2011 در 4:46 ب.ظ.

    ببخشید شما میتونید بهم کمک کنین باتشکر

  1. No trackbacks yet.

پاسخی بگذارید

در پایین مشخصات خود را پر کنید یا برای ورود روی شمایل‌ها کلیک نمایید:

نشان‌وارهٔ وردپرس.کام

شما در حال بیان دیدگاه با حساب کاربری WordPress.com خود هستید. بیرون رفتن / تغییر دادن )

تصویر توییتر

شما در حال بیان دیدگاه با حساب کاربری Twitter خود هستید. بیرون رفتن / تغییر دادن )

عکس فیسبوک

شما در حال بیان دیدگاه با حساب کاربری Facebook خود هستید. بیرون رفتن / تغییر دادن )

عکس گوگل+

شما در حال بیان دیدگاه با حساب کاربری Google+ خود هستید. بیرون رفتن / تغییر دادن )

درحال اتصال به %s

%d وب‌نوشت‌نویس این را دوست دارند: