نمایش نتایج 1 تا 10 از 10

نام تاپیک: استفاده از ROW_NUMBER() بر صفحه بندی

  1. #1
    کاربر دائمی آواتار mohsen_zelzela00
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    internet && .net
    پست
    755

    استفاده از ROW_NUMBER() بر صفحه بندی

    با عرض سلام خدمت اساتید محترم
    من کد زیر نوشتم

    ALTER PROCEDURE [dbo].[SPSelectReport4] (@StringWhereParameter nvarchar(4000))
    AS
    BEGIN

    SET NOCOUNT ON;





    -- َ Begin Of Transaction
    begin tran

    declare @Query nvarchar(max)
    set @Query='
    select * from (
    ((SELECT Id,[Mesc]
    ,[Line]
    ,[Unit]
    ,[Description]
    ,[ST_CODE]
    ,[PbsNo]
    ,[PbsDate]
    ,[PbsQty]
    ,[PbsQtyRec]
    ,[QtyConsum1]
    ,[QtyConsum2]
    ,[QtyConsum3]
    ,[QtyConsum4]
    ,[QtyConsum5]
    ,[Type]
    ,[InvQty]
    ,[TypeRequest]
    ,[HeaderId]
    FROM [MyMaterialDB].[dbo].[Report4]
    WHERE headerid IN(SELECT HeaderId FROM [MyMaterialDB].[dbo].[Report4] WHERE line=''H'''+ @StringWhereParameter+'))
    UNION
    (
    (SELECT Id,[Mesc]
    ,[Line]
    ,[Unit]
    ,[Description]
    ,[ST_CODE]
    ,[PbsNo]
    ,[PbsDate]
    ,[PbsQty]
    ,[PbsQtyRec]
    ,[QtyConsum1]
    ,[QtyConsum2]
    ,[QtyConsum3]
    ,[QtyConsum4]
    ,[QtyConsum5]
    ,[Type]
    ,[InvQty]
    ,[TypeRequest]
    ,[HeaderId]
    FROM [MyMaterialDB].[dbo].[Report4]
    WHERE mesc IN(SELECT mesc FROM [MyMaterialDB].[dbo].[Report4] WHERE line=''I''' +@StringWhereParameter+'))
    UNION
    (SELECT Id,[Mesc]
    ,[Line]
    ,[Unit]
    ,[Description]
    ,[ST_CODE]
    ,[PbsNo]
    ,[PbsDate]
    ,[PbsQty]
    ,[PbsQtyRec]
    ,[QtyConsum1]
    ,[QtyConsum2]
    ,[QtyConsum3]
    ,[QtyConsum4]
    ,[QtyConsum5]
    ,[Type]
    ,[InvQty]
    ,[TypeRequest]
    ,[HeaderId]
    FROM [MyMaterialDB].[dbo].[Report4]
    WHERE mesc IN(SELECT HeaderId FROM [MyMaterialDB].[dbo].[Report4] WHERE line=''I'''+@StringWhereParameter+')
    ))))
    Order by Mesc,Line,unit'

    --

    exec(@Query)


    if @@error = 0
    Commit Tran
    Else
    rollback tran
    End



    این کوئری تعداد رکوردهای خیلی زیادی رو بر می گردونه می خواستم که با استفاده از ROW_NUMBER() عملیات Paging رو انجام بدم ممنون میشم اساتید محترم راهنمایی کنند.

  2. #2

    نقل قول: استفاده از ROW_NUMBER() بر صفحه بندی

    ابتدای کدتون بصورت زیر باشه
    Select 
    Row_Number() Over(Order By Mesc,Line,unit) RowID,
    *
    From (
    ((SELECT Id,[Mesc]
    ...


    انتهای کدتون (به جای Order By) هم چیزی شبیه کد زیر (تعداد سطر در هر صفحه 100 فرض شده)
    Where 
    RowID > ' + (@PageNumber - 1) * 100 + '
    AND
    RowID <= ' + @PageNumber * 100
    به سوالات خصوصی پاسخ داده نمی شود.

  3. #3
    کاربر دائمی آواتار mohsen_zelzela00
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    internet && .net
    پست
    755

    نقل قول: استفاده از ROW_NUMBER() بر صفحه بندی

    نقل قول نوشته شده توسط Reza_Yarahmadi مشاهده تاپیک
    ابتدای کدتون بصورت زیر باشه
    Select 
    Row_Number() Over(Order By Mesc,Line,unit) RowID,
    *
    From (
    ((SELECT Id,[Mesc]
    ...


    انتهای کدتون (به جای Order By) هم چیزی شبیه کد زیر (تعداد سطر در هر صفحه 100 فرض شده)
    Where 
    RowID > ' + (@PageNumber - 1) * 100 + '
    AND
    RowID <= ' + @PageNumber * 100

    زمانی که این دستور رو بنویسم میگه که RowID رو نمی شناسه . الیته درست هم میگه. چون ما در این Query فیلد RowId رو خودمون ایجاد کردیم. استاد به نظر شما راحل چیست؟؟ من دستور زیر رو نوشتم ولی خب به نظر من درست نیست چون سرعتش خیلی پایین میات



    ALTER PROCEDURE [dbo].[SPSelectReport2] (@StringWhereParameter nvarchar(4000),@PageIndex int,@PageSize int)
    AS
    BEGIN

    SET NOCOUNT ON;

    -- َ Begin Of Transaction
    begin tran

    declare @from int=(@PageSize*(@PageIndex-1))+1
    declare @to int=(@PageIndex*@PageSize)

    declare @Query nvarchar(max)
    set @Query=' select

    distinct id,[Mesc], [Line]
    ,[Unit]
    ,[Discription]
    ,[InvQty]
    ,[LastDateNil]
    ,[StCode]
    ,[PlanCode]
    ,[MIN]
    ,[MAX]
    ,[LastDateConsum]
    ,[PbsNo]
    ,[PbsDate]
    ,[PbsQty]
    ,[PbsQtyRec]
    ,[DateDelay]
    ,[TypeRequest]
    ,[HeaderId]
    from (

    SELECT *, ROW_NUMBER() OVER(ORDER BY Id) ROW_NUM
    FROM(
    ((SELECT Id,[Mesc]
    ,[Line]
    ,[Unit]
    ,[Discription]
    ,[InvQty]
    ,[LastDateNil]
    ,[StCode]
    ,[PlanCode]
    ,[MIN]
    ,[MAX]
    ,[LastDateConsum]
    ,[PbsNo]
    ,[PbsDate]
    ,[PbsQty]
    ,[PbsQtyRec]
    ,[DateDelay]
    ,[TypeRequest]
    ,[HeaderId]
    FROM [MyMaterialDB].[dbo].[Report2]
    WHERE headerid IN(SELECT HeaderId FROM [MyMaterialDB].[dbo].[Report2] WHERE line=''H'''+ @StringWhereParameter+'))
    UNION
    (
    (SELECT Id,[Mesc]
    ,[Line]
    ,[Unit]
    ,[Discription]
    ,[InvQty]
    ,[LastDateNil]
    ,[StCode]
    ,[PlanCode]
    ,[MIN]
    ,[MAX]
    ,[LastDateConsum]
    ,[PbsNo]
    ,[PbsDate]
    ,[PbsQty]
    ,[PbsQtyRec]
    ,[DateDelay]
    ,[TypeRequest]
    ,[HeaderId]
    FROM [MyMaterialDB].[dbo].[Report2]
    WHERE mesc IN(SELECT mesc FROM [MyMaterialDB].[dbo].[Report2] WHERE line=''I''' +@StringWhereParameter+'))
    UNION
    (SELECT Id, [Mesc]
    ,[Line]
    ,[Unit]
    ,[Discription]
    ,[InvQty]
    ,[LastDateNil]
    ,[StCode]
    ,[PlanCode]
    ,[MIN]
    ,[MAX]
    ,[LastDateConsum]
    ,[PbsNo]
    ,[PbsDate]
    ,[PbsQty]
    ,[PbsQtyRec]
    ,[DateDelay]
    ,[TypeRequest]
    ,[HeaderId]
    FROM [MyMaterialDB].[dbo].[Report2]
    WHERE mesc IN(SELECT HeaderId FROM [MyMaterialDB].[dbo].[Report2] WHERE line=''I'''+@StringWhereParameter+')
    )))) a)b where b.ROW_NUM between '+CAST(@from as varchar(10))+' and '+CAST(@to as varchar(10))

    -- Order by Mesc,Line,unit
    exec(@Query)
    -- print @Query


    if @@error = 0
    Commit Tran
    Else
    rollback tran
    End




  4. #4

    نقل قول: استفاده از ROW_NUMBER() بر صفحه بندی

    بصورت زیر امتحان کنید

    set @Query='With Res as(
    select
    RowNumber() Over(Order By Mesc,Line,unit) RowID,
    *
    from (
    ((SELECT Id,[Mesc]
    ,[Line]
    ,[Unit]
    ,[Description]
    ,[ST_CODE]
    ,[PbsNo]
    ,[PbsDate]
    ,[PbsQty]
    ,[PbsQtyRec]
    ,[QtyConsum1]
    ,[QtyConsum2]
    ,[QtyConsum3]
    ,[QtyConsum4]
    ,[QtyConsum5]
    ,[Type]
    ,[InvQty]
    ,[TypeRequest]
    ,[HeaderId]
    FROM [MyMaterialDB].[dbo].[Report4]
    WHERE headerid IN(SELECT HeaderId FROM [MyMaterialDB].[dbo].[Report4] WHERE line=''H'''+ @StringWhereParameter+'))
    UNION
    (
    (SELECT Id,[Mesc]
    ,[Line]
    ,[Unit]
    ,[Description]
    ,[ST_CODE]
    ,[PbsNo]
    ,[PbsDate]
    ,[PbsQty]
    ,[PbsQtyRec]
    ,[QtyConsum1]
    ,[QtyConsum2]
    ,[QtyConsum3]
    ,[QtyConsum4]
    ,[QtyConsum5]
    ,[Type]
    ,[InvQty]
    ,[TypeRequest]
    ,[HeaderId]
    FROM [MyMaterialDB].[dbo].[Report4]
    WHERE mesc IN(SELECT mesc FROM [MyMaterialDB].[dbo].[Report4] WHERE line=''I''' +@StringWhereParameter+'))
    UNION
    (SELECT Id,[Mesc]
    ,[Line]
    ,[Unit]
    ,[Description]
    ,[ST_CODE]
    ,[PbsNo]
    ,[PbsDate]
    ,[PbsQty]
    ,[PbsQtyRec]
    ,[QtyConsum1]
    ,[QtyConsum2]
    ,[QtyConsum3]
    ,[QtyConsum4]
    ,[QtyConsum5]
    ,[Type]
    ,[InvQty]
    ,[TypeRequest]
    ,[HeaderId]
    FROM [MyMaterialDB].[dbo].[Report4]
    WHERE mesc IN(SELECT HeaderId FROM [MyMaterialDB].[dbo].[Report4] WHERE line=''I'''+@StringWhereParameter+')
    )))))
    Select * From Res
    Where
    RowID > ' + (@PageNumber - 1) * 100 + '
    AND
    RowID <= ' + @PageNumber * 100


    exec(@Query)
    به سوالات خصوصی پاسخ داده نمی شود.

  5. #5
    کاربر دائمی آواتار mohsen_zelzela00
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    internet && .net
    پست
    755

    نقل قول: استفاده از ROW_NUMBER() بر صفحه بندی

    نقل قول نوشته شده توسط Reza_Yarahmadi مشاهده تاپیک
    بصورت زیر امتحان کنید

    set @Query='With Res as(
    select
    RowNumber() Over(Order By Mesc,Line,unit) RowID,
    *
    from (
    ((SELECT Id,[Mesc]
    ,[Line]
    ,[Unit]
    ,[Description]
    ,[ST_CODE]
    ,[PbsNo]
    ,[PbsDate]
    ,[PbsQty]
    ,[PbsQtyRec]
    ,[QtyConsum1]
    ,[QtyConsum2]
    ,[QtyConsum3]
    ,[QtyConsum4]
    ,[QtyConsum5]
    ,[Type]
    ,[InvQty]
    ,[TypeRequest]
    ,[HeaderId]
    FROM [MyMaterialDB].[dbo].[Report4]
    WHERE headerid IN(SELECT HeaderId FROM [MyMaterialDB].[dbo].[Report4] WHERE line=''H'''+ @StringWhereParameter+'))
    UNION
    (
    (SELECT Id,[Mesc]
    ,[Line]
    ,[Unit]
    ,[Description]
    ,[ST_CODE]
    ,[PbsNo]
    ,[PbsDate]
    ,[PbsQty]
    ,[PbsQtyRec]
    ,[QtyConsum1]
    ,[QtyConsum2]
    ,[QtyConsum3]
    ,[QtyConsum4]
    ,[QtyConsum5]
    ,[Type]
    ,[InvQty]
    ,[TypeRequest]
    ,[HeaderId]
    FROM [MyMaterialDB].[dbo].[Report4]
    WHERE mesc IN(SELECT mesc FROM [MyMaterialDB].[dbo].[Report4] WHERE line=''I''' +@StringWhereParameter+'))
    UNION
    (SELECT Id,[Mesc]
    ,[Line]
    ,[Unit]
    ,[Description]
    ,[ST_CODE]
    ,[PbsNo]
    ,[PbsDate]
    ,[PbsQty]
    ,[PbsQtyRec]
    ,[QtyConsum1]
    ,[QtyConsum2]
    ,[QtyConsum3]
    ,[QtyConsum4]
    ,[QtyConsum5]
    ,[Type]
    ,[InvQty]
    ,[TypeRequest]
    ,[HeaderId]
    FROM [MyMaterialDB].[dbo].[Report4]
    WHERE mesc IN(SELECT HeaderId FROM [MyMaterialDB].[dbo].[Report4] WHERE line=''I'''+@StringWhereParameter+')
    )))))
    Select * From Res
    Where
    RowID > ' + (@PageNumber - 1) * 100 + '
    AND
    RowID <= ' + @PageNumber * 100


    exec(@Query)
    مرسی استاد فقط یه سوال تفاوت کدی که من نوشتم با این کد در چیست ؟؟ چون از لحاظ زمانی هر دو برابر هستند(یه جورایی خیلی طول می کشد)

  6. #6
    کاربر دائمی آواتار mohsen_zelzela00
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    internet && .net
    پست
    755

    نقل قول: استفاده از ROW_NUMBER() بر صفحه بندی

    آیا میشه این Query رو به صورت بهینه نوشت ؟؟؟ آخه الان برای یک Table با 576822 رکورد یه چیزی حدود 7 دقیقه طول میکشه که واقعاً زیاده.

  7. #7

    نقل قول: استفاده از ROW_NUMBER() بر صفحه بندی

    سلام.
    Execution Plan اونو ذخیره کرده اینجا قرار بدید.

  8. #8

    نقل قول: استفاده از ROW_NUMBER() بر صفحه بندی

    درود بر شما

    نمی خواستم تایپیک جدید بزنم ولی سوالم مربوط به همین موضوع است. من کوئری رو به این صورت نوشتم:


    Declare @Page int

    Set @Page = 1 -- صفحه یک

    Select * FROM (Select ROW_NUMBER () OVER (Order By EmpID) RowID, * FROM Employees)
    WHERE RowID >= (@Page -1)*10 AND RowID < (@Page * 10)


    کدام روش بهتر است؟

    در واقع اومدم گفتم جدول Employee و ستون RowID ادغام شوند و بشوند یک جدول و بعد تمام فیلدهای آن جدول (ترکیب RowID و Employees)

  9. #9

    نقل قول: استفاده از ROW_NUMBER() بر صفحه بندی

    منطق کوئری اشکال داره. جای مساوی باید عوض بشه:

    Select *
    FROM (Select ROW_NUMBER () OVER (Order By EmpID) RowID, *
    FROM Employees) as t
    WHERE t.RowID > (@Page -1)*10 AND RowID <= (@Page * 10)

    /* OR
    ;with cte as
    (
    Select ROW_NUMBER () OVER (Order By EmpID) RowID, *
    FROM Employees
    )
    select *
    from cte
    where cte.RowID > (@Page-1)*10 and cte.RowID <= (@Page*10)
    */
    آخرین ویرایش به وسیله Mahmoud.Afrad : سه شنبه 29 مرداد 1392 در 13:50 عصر

  10. #10

    نقل قول: استفاده از ROW_NUMBER() بر صفحه بندی

    جناب Mahmoud.Afrad درست می فرمایید. اگر مساوی رو در اول بگذارم یک رکورد کمتر از چیزی که می خواهم می آورد.

    نمونه کد زیر اصلاح شده بالاست که دوستان می توانند استفاده کنند. امیدوارم مفید واقع بشود:


    Declare @Page int
    Declare @PerPage int


    Set @Page = 1 -- صفحه یک
    Set @PerPage = 10 -- ده رکورد در هر صفحه


    Select * FROM (Select ROW_NUMBER () OVER (Order By EmpID) RowID, * FROM Employees)
    WHERE RowID > (@Page - 1) * @PerPage AND RowID <= (@Page * @PerPage)





    متغیر @Page: شماره صفحه می باشد. مثلا صفحه شماره هفت یا یازده یا ...
    متغیر @PerPage: در هر صفحه، چند رکورد فراخوانی شود.

تاپیک های مشابه

  1. مبتدی: صفحه بندی بدون استفاده از GridView یا دیتالیست
    نوشته شده توسط mahmoudkarami در بخش ASP.NET Web Forms
    پاسخ: 2
    آخرین پست: چهارشنبه 18 مرداد 1391, 19:17 عصر
  2. صفحه بندی grid view با استفاده از linq to sql
    نوشته شده توسط خسرو خان در بخش C#‎‎
    پاسخ: 0
    آخرین پست: سه شنبه 10 مرداد 1391, 07:23 صبح
  3. سوال: صفحه بندی اطلاعات بدون استفاده از گرید ویو ؟
    نوشته شده توسط nasinas در بخش ASP.NET Web Forms
    پاسخ: 7
    آخرین پست: چهارشنبه 06 مهر 1390, 21:11 عصر
  4. سوال: طریقه استفاده از یک کامپیوننت برای صفحه بندی GridView
    نوشته شده توسط IranVisual در بخش ASP.NET Web Forms
    پاسخ: 1
    آخرین پست: سه شنبه 07 خرداد 1387, 08:24 صبح
  5. صفحه بندی (paging) با استفاده از فیلد تاریخ
    نوشته شده توسط hesam_hma در بخش SQL Server
    پاسخ: 1
    آخرین پست: یک شنبه 14 بهمن 1386, 08:20 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •