sql কশন এসকিউএল সার্ভারে ফলাফল প্যাগিনেট করার সেরা উপায় কি




এসকিউএল ইনজেকশন (13)

ভাল আমি আমার এসকিউএল 2000 ডাটাবেস নিম্নলিখিত নমুনা প্রশ্নের ব্যবহার করেছেন, এটি SQL 2005 খুব ভাল কাজ করে। এটি আপনাকে দেয় ক্ষমতা একাধিক কলাম ব্যবহার করে গতিশীল ক্রম। আমি আপনাকে বলছি ... এই শক্তিশালী :)

    ALTER PROCEDURE [dbo].[RE_ListingReports_SelectSummary] 

@CompanyID  int,
@pageNumber     int,
@pageSize   int, 
@sort       varchar(200)
AS

DECLARE @sql nvarchar(4000)
DECLARE @strPageSize nvarchar(20)
DECLARE @strSkippedRows nvarchar(20)
DECLARE @strFields nvarchar(4000)
DECLARE @strFilter nvarchar(4000)
DECLARE @sortBy nvarchar(4000)
DECLARE @strFrom nvarchar(4000)
DECLARE @strID nvarchar(100)

If(@pageNumber < 0)
  SET @pageNumber = 1
SET @strPageSize = CAST(@pageSize AS varchar(20)) 
SET @strSkippedRows = CAST(((@pageNumber - 1) * @pageSize) AS varchar(20))-- For    example if pageNumber is 5  pageSize is 10, then SkippedRows = 40.
SET @strID = 'ListingDbID'
SET @strFields = 'ListingDbID,
ListingID,  
[ExtraRoom]
'
SET @strFrom = ' vwListingSummary '

SET @strFilter = ' WHERE
        CompanyID = ' + CAST(@CompanyID As varchar(20)) 
End
SET @sortBy = ''
if(len(ltrim(rtrim(@sort))) > 0)
SET @sortBy = ' Order By ' + @sort

-- Total Rows Count

SET @sql =  'SELECT Count(' + @strID + ')  FROM ' + @strFROM + @strFilter
EXEC sp_executesql @sql

--// This technique is used in a Single Table pagination
SET @sql = 'SELECT ' + @strFields + ' FROM ' + @strFROM +
    ' WHERE ' + @strID +  ' IN ' + 
   '  (SELECT TOP ' + @strPageSize + ' ' + @strID + ' FROM ' + @strFROM + @strFilter + 
             ' AND  ' + @strID + ' NOT IN ' + '
          (SELECT TOP ' + @strSkippedRows + ' ' + @strID + ' FROM ' + @strFROM + @strFilter + @SortBy + ') ' 
   + @SortBy + ') ' + @SortBy
Print @sql 
EXEC sp_executesql @sql

সেরা অংশ sp_executesql ক্যাশে পরে কল হয়, যদি আপনি একই প্যারামিটার পাস করেন তবে একই এসকিউএল টেক্সট তৈরি করুন।

এসকিউএল সার্ভার 2000, 2005, ২008, ২01২ সালে ফলাফলগুলি প্যাগিনেট করার সর্বোত্তম উপায় (কর্মক্ষমতা অনুসারে) যদি আপনি ফলাফলগুলির মোট সংখ্যা পেতে চান (প্যাগনিটিংয়ের আগে)?


create PROCEDURE SP_Company_List (@pagesize int = -1 ,@pageindex int= 0   ) > AS BEGIN  SET NOCOUNT ON;


    select  Id , NameEn     from Company  ORDER by Id ASC  
OFFSET (@pageindex-1 )* @pagesize   ROWS FETCH NEXt @pagesize ROWS ONLY END  GO
DECLARE   @return_value int

EXEC  @return_value = [dbo].[SP_Company_List]         @pagesize = 1 ,         > @pageindex = 2

SELECT    'Return Value' = @return_value

GO

ফলাফল এবং প্যাগনিটিং মোট সংখ্যা দুটি ভিন্ন অপারেশন। এই উদাহরণের জন্য, আসুন ধরুন যে আপনি যে প্রশ্নের সাথে ডিল করছেন তা হল

SELECT * FROM Orders WHERE OrderDate >= '1980-01-01' ORDER BY OrderDate

এই ক্ষেত্রে, আপনি ব্যবহার করে ফলাফলের মোট সংখ্যা নির্ধারণ করবে:

SELECT COUNT(*) FROM Orders WHERE OrderDate >= '1980-01-01'

... যা অদক্ষ বলে মনে হতে পারে, তবে আসলেই বেশ কার্যকরী, সমস্ত সূচী ইত্যাদি অনুমান করা হয় সঠিকভাবে সেট আপ করা হয়।

পরবর্তীতে, প্রকৃত ফলাফলগুলি একটি পেজড ফ্যাশনে ফিরে পেতে, নিম্নলিখিত প্রশ্নটি সবচেয়ে কার্যকর হবে:

SELECT  *
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum, *
          FROM      Orders
          WHERE     OrderDate >= '1980-01-01'
        ) AS RowConstrainedResult
WHERE   RowNum >= 1
    AND RowNum < 20
ORDER BY RowNum

এটি মূল প্রশ্নটির 1-19 সারি ফেরত দেবে। এখানে বিশেষত ওয়েব অ্যাপ্লিকেশনের জন্য দুর্দান্ত জিনিসটি হল যে সারি নম্বরটি ফেরত দেওয়া ছাড়া আপনি কোনও রাষ্ট্র রাখতে হবে না।


অবিশ্বাস্যভাবে, অন্য কোনও উত্তরটি সমস্ত SQL সার্ভার সংস্করণগুলিতে পৃষ্ঠাঙ্কন করার দ্রুততম উপায় উল্লেখ করেছে। 4guysfromrolla.com/webtech/042606-1.shtml হিসাবে অফসেট বড় পৃষ্ঠা নম্বর জন্য খুব ধীর হতে পারে। এসকিউএল মধ্যে পজিশনিং সঞ্চালনের একটি সম্পূর্ণ ভিন্ন, অনেক দ্রুত উপায় আছে। এই ব্লগ পোস্টে বর্ণিত হিসাবে এটি প্রায়শই "সন্ধান পদ্ধতি" বা "কীসেট পৃষ্ঠাঙ্কন" বলা হয়।

SELECT TOP 10 first_name, last_name, score, COUNT(*) OVER()
FROM players
WHERE (score < @previousScore)
   OR (score = @previousScore AND player_id < @previousPlayerId)
ORDER BY score DESC, player_id DESC

"পূর্বাভাস চাইতে"

@previousScore এবং @previousPlayerId মান পূর্ববর্তী পৃষ্ঠার শেষ রেকর্ডের সম্পর্কিত মান। এটি আপনাকে "পরবর্তী" পৃষ্ঠাটি আনতে সক্ষম করে। যদি নির্দেশ অনুসারে ORDER BY ASC হয় তবে পরিবর্তে এটি ব্যবহার >

উপরের পদ্ধতির সাথে, আপনি 40 টি পূর্ববর্তী রেকর্ডগুলি না পেয়ে অবিলম্বে পৃষ্ঠা 4 তে উঠতে পারবেন না। কিন্তু প্রায়ই, আপনি যেহেতু যে পর্যন্ত লাফ দিতে চান না। পরিবর্তে, আপনি একটি দ্রুততর ক্যোয়ারী পাবেন যা আপনার সূচকের উপর নির্ভর করে ধ্রুবক সময়ে ডেটা আনতে সক্ষম হতে পারে। উপরন্তু, আপনার পৃষ্ঠাগুলি "স্থিতিশীল" থাকে, অন্তর্নিহিত ডেটা পরিবর্তিত হয় কিনা তা কোন ব্যাপার না (যেমন পৃষ্ঠা 1 তে, আপনি যখন পৃষ্ঠা 4 তে থাকেন)।

উদাহরণস্বরূপ, ওয়েব অ্যাপ্লিকেশনগুলিতে অলস তথ্য আরো লোড করার সময় পৃষ্ঠাটি বাস্তবায়ন করার এটি সর্বোত্তম উপায়।

নোট, "পদ্ধতি সন্ধান করুন" কেওসেট পজিশন বলা হয়।

পজিশন আগে মোট রেকর্ড

COUNT(*) OVER() উইন্ডো ফাংশন আপনাকে "প্যাগিনেশন এর আগে" মোট রেকর্ডের সংখ্যা গণনা করতে সহায়তা করবে। আপনি যদি SQL সার্ভার 2000 ব্যবহার করেন, তবে COUNT(*) জন্য আপনাকে দুটি প্রশ্নগুলি অবলম্বন করতে হবে।


SQL সার্ভার 2000 এর জন্য আপনি একটি IDENTITY কলাম সহ একটি টেবিল পরিবর্তনশীল ব্যবহার করে ROW_NUMBER () অনুকরণ করতে পারেন:

DECLARE @pageNo int -- 1 based
DECLARE @pageSize int
SET @pageNo = 51
SET @pageSize = 20

DECLARE @firstRecord int
DECLARE @lastRecord int
SET @firstRecord = (@pageNo - 1) * @pageSize + 1 -- 1001
SET @lastRecord = @firstRecord + @pageSize - 1   -- 1020

DECLARE @orderedKeys TABLE (
  rownum int IDENTITY NOT NULL PRIMARY KEY CLUSTERED,
  TableKey int NOT NULL
)

SET ROWCOUNT @lastRecord
INSERT INTO @orderedKeys (TableKey) SELECT ID FROM Orders WHERE OrderDate >= '1980-01-01' ORDER BY OrderDate

SET ROWCOUNT 0

SELECT t.*
FROM Orders t
  INNER JOIN @orderedKeys o ON o.TableKey = t.ID
WHERE o.rownum >= @firstRecord
ORDER BY o.rownum

এই পদ্ধতিটি মাল্টি-কলাম কীগুলির সাথে সারণিতে প্রসারিত করা যেতে পারে এবং এটি OR ব্যবহার করে কর্মক্ষমতা ওভারহেড করা হয় না (যা ইন্ডেক্স ব্যবহারকে ছাড়ায়)। ডেটাসাইডটি হ'ল ডেটা সেটটি খুব বড় এবং যদি শেষ পৃষ্ঠাটির কাছাকাছি থাকে তবে অস্থায়ী স্থানটি ব্যবহৃত হয়। আমি যে ক্ষেত্রে কার্সার কর্মক্ষমতা পরীক্ষা না, কিন্তু এটা ভাল হতে পারে।

উল্লেখ্য যে এই পদ্ধতির ডেটা প্রথম পৃষ্ঠার জন্য অপ্টিমাইজ করা যেতে পারে। এছাড়াও, ROWCOUNT ব্যবহার করা হয়েছিল যেহেতু TOP এসকিউএল সার্ভার 2000 এ একটি পরিবর্তনশীল গ্রহণ করে না।


http://www.codeproject.com/KB/aspnet/PagingLarge.aspx এ বিভিন্ন পেজিং কৌশলগুলির একটি ভাল ওভারভিউ রয়েছে

আমি প্রায়শই বেশিরভাগই এসকিউএল সার্ভার 2000 এর সাথে ROWCOUNT পদ্ধতিটি ব্যবহার করেছি (2005 এবং 2008 এর সাথেও কাজ করবে, ROW_NUMBER এর তুলনায় কেবলমাত্র পরিমাপ পরিমাপ করবে), এটি দ্রুত গতিতে চলবে তবে আপনাকে নিশ্চিত করতে হবে যে সাজানো কলামগুলি ) অনন্য মান।


এসকিউএল সার্ভার 2012 থেকে, আমরা পৃষ্ঠাটি অর্জন করতে OFFSET এবং FETCH NEXT ক্লোজ ব্যবহার করতে পারি।

SQL সার্ভারের জন্য এটি ব্যবহার করে দেখুন:

এসকিউএল সার্ভার ২01২-এ একটি নতুন বৈশিষ্ট্য যুক্ত করা হয়েছে, একটি সেট ডেটা অপ্টিমাইজেশান ক্যোয়ারী করার জন্য, টি-এসকিউএল-এ লেখার জন্য ডেটা পেজিংয়ের সাথে সাথে সহজেই SQL সার্ভারে সম্পূর্ণ এক্সিকিউশন প্ল্যানের জন্য কাজটি সহজতর করার জন্য ORDER BY বিভাগে যোগ করা হয়েছে।

আগের উদাহরণে একই যুক্তি ব্যবহার করে টি-এসকিউএল স্ক্রিপ্টের নীচে।

--CREATING A PAGING WITH OFFSET and FETCH clauses IN "SQL SERVER 2012"
DECLARE @PageNumber AS INT, @RowspPage AS INT
SET @PageNumber = 2
SET @RowspPage = 10 
SELECT ID_EXAMPLE, NM_EXAMPLE, DT_CREATE
FROM TB_EXAMPLE
ORDER BY ID_EXAMPLE
OFFSET ((@PageNumber - 1) * @RowspPage) ROWS
FETCH NEXT @RowspPage ROWS ONLY;

TechNet: SQL সার্ভারের সাথে একটি প্রশ্ন পোস্ট করা


এই পদ্ধতির চেষ্টা করুন:

SELECT TOP @offset a.*
FROM (select top @limit b.*, COUNT(*) OVER() totalrows 
        from TABLENAME b order by id asc) a
ORDER BY id desc;

আপনি ভাষা বা কোন ড্রাইভার ব্যবহার করছেন তা নির্দিষ্ট করেন নি। অতএব আমি একেবারে বর্ণনা করছি।

  • একটি স্ক্রোলযোগ্য ফলাফল / ডেটাসেট তৈরি করুন। এই টেবিলে একটি প্রাথমিক প্রয়োজন
  • শেষ পর্যন্ত লাফ
  • সারি গণনা অনুরোধ
  • পৃষ্ঠার শুরুতে লাফ দাও
  • পৃষ্ঠার শেষ পর্যন্ত সারি দিয়ে স্ক্রোল করুন

   CREATE view vw_sppb_part_listsource as 
    select row_number() over (partition by sppb_part.init_id order by sppb_part.sppb_part_id asc ) as idx, * from (
      select 
          part.SPPB_PART_ID
          , 0 as is_rev
          , part.part_number 
          , part.init_id 
      from t_sppb_init_part part 
      left join t_sppb_init_partrev prev on ( part.SPPB_PART_ID = prev.SPPB_PART_ID )
      where prev.SPPB_PART_ID is null 
      union 
      select 
          part.SPPB_PART_ID
          , 1 as is_rev
          , prev.part_number 
          , part.init_id 
      from t_sppb_init_part part 
      inner join t_sppb_init_partrev prev on ( part.SPPB_PART_ID = prev.SPPB_PART_ID )
    ) sppb_part

আইটিএক্স পুনরায় শুরু হবে যখন এটি ভিন্ন init_id আসে


এসকিউএল সার্ভার পার্শ্ব মধ্যে প্রশ্নের ফলাফল পেজিং জন্য এই আমার সমাধান। এই পদ্ধতিগুলি এসকিউএল সার্ভার 2008 এবং ২01২ এর মধ্যে আলাদা। এছাড়াও, আমি কলামের মাধ্যমে ফিল্টারিং এবং অর্ডারের ধারণাকে যুক্ত করেছি। যখন আপনি আপনার গ্রিডউইউউমে পেজিং এবং ফিল্টারিং এবং অর্ডার করছেন তখন এটি খুব কার্যকর।

পরীক্ষার আগে, আপনাকে একটি নমুনা টেবিল তৈরি করতে হবে এবং এই টেবিলে কিছু সারি সন্নিবেশ করাতে হবে: (বাস্তব জগতে আপনাকে পরিবর্তন করতে হবে যেখানে আপনার টেবিলের ক্ষেত্রগুলি বিবেচনা করে এবং সম্ভবত আপনার নির্বাচিত অংশে কিছু যোগদান এবং উপযোজন রয়েছে)

Create Table VLT
(
    ID int IDentity(1,1),
    Name nvarchar(50),
    Tel Varchar(20)
)
GO


Insert INTO VLT
VALUES
    ('NAME' + Convert(varchar(10),@@identity),'FAMIL' + Convert(varchar(10),@@identity))
GO 500000

এই নমুনাগুলিতে, আমি প্রতি পৃষ্ঠায় 200 সারি অনুসন্ধান করতে চাই এবং আমি পৃষ্ঠা নম্বর 1২00 এর জন্য সারি আনছি।

এসকিউএল সার্ভার 2008, আপনি সিটিই ধারণা ব্যবহার করতে পারেন। এর কারণে, আমি SQL সার্ভার ২008+ এর জন্য দুটি ধরণের প্রশ্ন লিখেছি

- এসকিউএল সার্ভার 2008+

DECLARE @PageNumber Int = 1200
DECLARE @PageSize INT = 200
DECLARE @SortByField int = 1 --The field used for sort by
DECLARE @SortOrder nvarchar(255) = 'ASC' --ASC or DESC
DECLARE @FilterType nvarchar(255) = 'None' --The filter type, as defined on the client side (None/Contain/NotContain/Match/NotMatch/True/False/)
DECLARE @FilterValue nvarchar(255) = '' --The value the user gave for the filter
DECLARE @FilterColumn int = 1 --The column to wich the filter is applied, represents the column number like when we send the information.

SELECT 
  Data.ID,
  Data.Name,
  Data.Tel
FROM
  (  
    SELECT 
      ROW_NUMBER() 
        OVER( ORDER BY 
                CASE WHEN @SortByField = 1 AND @SortOrder = 'ASC'
                      THEN VLT.ID END ASC,
                CASE WHEN @SortByField = 1 AND @SortOrder = 'DESC'
                      THEN VLT.ID END DESC,
                CASE WHEN @SortByField = 2 AND @SortOrder = 'ASC'
                      THEN VLT.Name END ASC,
                CASE WHEN @SortByField = 2 AND @SortOrder = 'DESC'
                      THEN VLT.Name END ASC,
                CASE WHEN @SortByField = 3 AND @SortOrder = 'ASC'
                      THEN VLT.Tel END ASC,
                CASE WHEN @SortByField = 3 AND @SortOrder = 'DESC'
                      THEN VLT.Tel END ASC
         ) AS RowNum
      ,*  
    FROM VLT 
    WHERE
      ( -- We apply the filter logic here
        CASE
          WHEN @FilterType = 'None' THEN 1

          -- Name column filter
          WHEN @FilterType = 'Contain' AND @FilterColumn = 1
            AND ( -- In this case, when the filter value is empty, we want to show everything.
                VLT.ID LIKE '%' + @FilterValue + '%'
               OR
                @FilterValue = ''
               ) THEN 1
          WHEN @FilterType = 'NotContain' AND @FilterColumn = 1
            AND ( -- In this case, when the filter value is empty, we want to show everything.
                VLT.ID NOT LIKE '%' + @FilterValue + '%'
               OR
                @FilterValue = ''
               ) THEN 1
          WHEN @FilterType = 'Match' AND @FilterColumn = 1
            AND VLT.ID = @FilterValue THEN 1
          WHEN @FilterType = 'NotMatch' AND @FilterColumn = 1
            AND VLT.ID <> @FilterValue THEN 1               

          -- Name column filter
          WHEN @FilterType = 'Contain' AND @FilterColumn = 2
            AND ( -- In this case, when the filter value is empty, we want to show everything.
                VLT.Name LIKE '%' + @FilterValue + '%'
               OR
                @FilterValue = ''
               ) THEN 1
          WHEN @FilterType = 'NotContain' AND @FilterColumn = 2
            AND ( -- In this case, when the filter value is empty, we want to show everything.
                VLT.Name NOT LIKE '%' + @FilterValue + '%'
               OR
                @FilterValue = ''
               ) THEN 1
          WHEN @FilterType = 'Match' AND @FilterColumn = 2
            AND VLT.Name = @FilterValue THEN 1
          WHEN @FilterType = 'NotMatch' AND @FilterColumn = 2
            AND VLT.Name <> @FilterValue THEN 1         

         -- Tel column filter   
         WHEN @FilterType = 'Contain' AND @FilterColumn = 3
            AND ( -- In this case, when the filter value is empty, we want to show everything.
                VLT.Tel LIKE '%' + @FilterValue + '%'
               OR
                @FilterValue = ''
               ) THEN 1
          WHEN @FilterType = 'NotContain' AND @FilterColumn = 3
            AND ( -- In this case, when the filter value is empty, we want to show everything.
                VLT.Tel NOT LIKE '%' + @FilterValue + '%'
               OR
                @FilterValue = ''
               ) THEN 1
          WHEN @FilterType = 'Match' AND @FilterColumn = 3
            AND VLT.Tel = @FilterValue THEN 1
          WHEN @FilterType = 'NotMatch' AND @FilterColumn = 3
            AND VLT.Tel <> @FilterValue THEN 1    

        END
      ) = 1   
  ) AS Data
WHERE Data.RowNum > @PageSize * (@PageNumber - 1)
  AND Data.RowNum <= @PageSize * @PageNumber
ORDER BY Data.RowNum

GO

এবং SQL সার্ভার 2008+ এ সিটিইয়ের সাথে দ্বিতীয় সমাধান

DECLARE @PageNumber Int = 1200
DECLARE @PageSize INT = 200
DECLARE @SortByField int = 1 --The field used for sort by
DECLARE @SortOrder nvarchar(255) = 'ASC' --ASC or DESC
DECLARE @FilterType nvarchar(255) = 'None' --The filter type, as defined on the client side (None/Contain/NotContain/Match/NotMatch/True/False/)
DECLARE @FilterValue nvarchar(255) = '' --The value the user gave for the filter
DECLARE @FilterColumn int = 1 --The column to wich the filter is applied, represents the column number like when we send the information.

;WITH
  Data_CTE
  AS
  (  
    SELECT 
      ROW_NUMBER() 
        OVER( ORDER BY 
                CASE WHEN @SortByField = 1 AND @SortOrder = 'ASC'
                      THEN VLT.ID END ASC,
                CASE WHEN @SortByField = 1 AND @SortOrder = 'DESC'
                      THEN VLT.ID END DESC,
                CASE WHEN @SortByField = 2 AND @SortOrder = 'ASC'
                      THEN VLT.Name END ASC,
                CASE WHEN @SortByField = 2 AND @SortOrder = 'DESC'
                      THEN VLT.Name END ASC,
                CASE WHEN @SortByField = 3 AND @SortOrder = 'ASC'
                      THEN VLT.Tel END ASC,
                CASE WHEN @SortByField = 3 AND @SortOrder = 'DESC'
                      THEN VLT.Tel END ASC
         ) AS RowNum
      ,*  
    FROM VLT
    WHERE
      ( -- We apply the filter logic here
        CASE
          WHEN @FilterType = 'None' THEN 1

          -- Name column filter
          WHEN @FilterType = 'Contain' AND @FilterColumn = 1
            AND ( -- In this case, when the filter value is empty, we want to show everything.
                VLT.ID LIKE '%' + @FilterValue + '%'
               OR
                @FilterValue = ''
               ) THEN 1
          WHEN @FilterType = 'NotContain' AND @FilterColumn = 1
            AND ( -- In this case, when the filter value is empty, we want to show everything.
                VLT.ID NOT LIKE '%' + @FilterValue + '%'
               OR
                @FilterValue = ''
               ) THEN 1
          WHEN @FilterType = 'Match' AND @FilterColumn = 1
            AND VLT.ID = @FilterValue THEN 1
          WHEN @FilterType = 'NotMatch' AND @FilterColumn = 1
            AND VLT.ID <> @FilterValue THEN 1               

          -- Name column filter
          WHEN @FilterType = 'Contain' AND @FilterColumn = 2
            AND ( -- In this case, when the filter value is empty, we want to show everything.
                VLT.Name LIKE '%' + @FilterValue + '%'
               OR
                @FilterValue = ''
               ) THEN 1
          WHEN @FilterType = 'NotContain' AND @FilterColumn = 2
            AND ( -- In this case, when the filter value is empty, we want to show everything.
                VLT.Name NOT LIKE '%' + @FilterValue + '%'
               OR
                @FilterValue = ''
               ) THEN 1
          WHEN @FilterType = 'Match' AND @FilterColumn = 2
            AND VLT.Name = @FilterValue THEN 1
          WHEN @FilterType = 'NotMatch' AND @FilterColumn = 2
            AND VLT.Name <> @FilterValue THEN 1         

         -- Tel column filter   
         WHEN @FilterType = 'Contain' AND @FilterColumn = 3
            AND ( -- In this case, when the filter value is empty, we want to show everything.
                VLT.Tel LIKE '%' + @FilterValue + '%'
               OR
                @FilterValue = ''
               ) THEN 1
          WHEN @FilterType = 'NotContain' AND @FilterColumn = 3
            AND ( -- In this case, when the filter value is empty, we want to show everything.
                VLT.Tel NOT LIKE '%' + @FilterValue + '%'
               OR
                @FilterValue = ''
               ) THEN 1
          WHEN @FilterType = 'Match' AND @FilterColumn = 3
            AND VLT.Tel = @FilterValue THEN 1
          WHEN @FilterType = 'NotMatch' AND @FilterColumn = 3
            AND VLT.Tel <> @FilterValue THEN 1    

        END
      ) = 1     
  )

SELECT 
  Data.ID,
  Data.Name,
  Data.Tel
FROM Data_CTE AS Data
WHERE Data.RowNum > @PageSize * (@PageNumber - 1)
  AND Data.RowNum <= @PageSize * @PageNumber
ORDER BY Data.RowNum

- এসকিউএল সার্ভার 2012+

DECLARE @PageNumber Int = 1200
DECLARE @PageSize INT = 200
DECLARE @SortByField int = 1 --The field used for sort by
DECLARE @SortOrder nvarchar(255) = 'ASC' --ASC or DESC
DECLARE @FilterType nvarchar(255) = 'None' --The filter type, as defined on the client side (None/Contain/NotContain/Match/NotMatch/True/False/)
DECLARE @FilterValue nvarchar(255) = '' --The value the user gave for the filter
DECLARE @FilterColumn int = 1 --The column to wich the filter is applied, represents the column number like when we send the information.

;WITH
  Data_CTE
  AS
  (  
    SELECT 
      *  
    FROM VLT
    WHERE
      ( -- We apply the filter logic here
        CASE
          WHEN @FilterType = 'None' THEN 1

          -- Name column filter
          WHEN @FilterType = 'Contain' AND @FilterColumn = 1
            AND ( -- In this case, when the filter value is empty, we want to show everything.
                VLT.ID LIKE '%' + @FilterValue + '%'
               OR
                @FilterValue = ''
               ) THEN 1
          WHEN @FilterType = 'NotContain' AND @FilterColumn = 1
            AND ( -- In this case, when the filter value is empty, we want to show everything.
                VLT.ID NOT LIKE '%' + @FilterValue + '%'
               OR
                @FilterValue = ''
               ) THEN 1
          WHEN @FilterType = 'Match' AND @FilterColumn = 1
            AND VLT.ID = @FilterValue THEN 1
          WHEN @FilterType = 'NotMatch' AND @FilterColumn = 1
            AND VLT.ID <> @FilterValue THEN 1               

          -- Name column filter
          WHEN @FilterType = 'Contain' AND @FilterColumn = 2
            AND ( -- In this case, when the filter value is empty, we want to show everything.
                VLT.Name LIKE '%' + @FilterValue + '%'
               OR
                @FilterValue = ''
               ) THEN 1
          WHEN @FilterType = 'NotContain' AND @FilterColumn = 2
            AND ( -- In this case, when the filter value is empty, we want to show everything.
                VLT.Name NOT LIKE '%' + @FilterValue + '%'
               OR
                @FilterValue = ''
               ) THEN 1
          WHEN @FilterType = 'Match' AND @FilterColumn = 2
            AND VLT.Name = @FilterValue THEN 1
          WHEN @FilterType = 'NotMatch' AND @FilterColumn = 2
            AND VLT.Name <> @FilterValue THEN 1         

         -- Tel column filter   
         WHEN @FilterType = 'Contain' AND @FilterColumn = 3
            AND ( -- In this case, when the filter value is empty, we want to show everything.
                VLT.Tel LIKE '%' + @FilterValue + '%'
               OR
                @FilterValue = ''
               ) THEN 1
          WHEN @FilterType = 'NotContain' AND @FilterColumn = 3
            AND ( -- In this case, when the filter value is empty, we want to show everything.
                VLT.Tel NOT LIKE '%' + @FilterValue + '%'
               OR
                @FilterValue = ''
               ) THEN 1
          WHEN @FilterType = 'Match' AND @FilterColumn = 3
            AND VLT.Tel = @FilterValue THEN 1
          WHEN @FilterType = 'NotMatch' AND @FilterColumn = 3
            AND VLT.Tel <> @FilterValue THEN 1    

        END
      ) = 1         
  )

SELECT 
  Data.ID,
  Data.Name,
  Data.Tel
FROM Data_CTE AS Data
ORDER BY 
    CASE WHEN @SortByField = 1 AND @SortOrder = 'ASC'
        THEN Data.ID END ASC,
    CASE WHEN @SortByField = 1 AND @SortOrder = 'DESC'
        THEN Data.ID END DESC,
    CASE WHEN @SortByField = 2 AND @SortOrder = 'ASC'
        THEN Data.Name END ASC,
    CASE WHEN @SortByField = 2 AND @SortOrder = 'DESC'
        THEN Data.Name END ASC,
    CASE WHEN @SortByField = 3 AND @SortOrder = 'ASC'
        THEN Data.Tel END ASC,
    CASE WHEN @SortByField = 3 AND @SortOrder = 'DESC'
        THEN Data.Tel END ASC
OFFSET @PageSize * (@PageNumber - 1) ROWS FETCH NEXT @PageSize ROWS ONLY;

অবশেষে, মাইক্রোসফ্ট এসকিউএল সার্ভার ২01২ মুক্তি পেয়েছিল, আমি সত্যিই প্যাগিনেশনের জন্য তার সরলতা পছন্দ করি, আপনাকে এখানে উত্তর মত জটিল প্রশ্নের ব্যবহার করতে হবে না।

পরবর্তী 10 সারি পাওয়ার জন্য এই প্রশ্নটি চালান:

SELECT * FROM TableName ORDER BY id OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

http://technet.microsoft.com/en-us/library/gg699618.aspx

এটি ব্যবহার করার সময় বিবেচনা মূল পয়েন্ট:

  • অফসেট BY OFFSET এবং FETCH ধারা ব্যবহার বাধ্যতামূলক।
  • অফসেট ধারা FETCH সঙ্গে বাধ্যতামূলক। আপনি কখনই ব্যবহার করতে পারবেন না, অর্ডার ... FETCH।
  • TOP একই ক্যোয়ারী এক্সপ্রেশনতে OFFSET এবং FETCH এর সাথে মিলিত করা যাবে না।

এসকিউএল সার্ভারে পেজিংয়ের জন্য সর্বোত্তম উপায় অফসেট ব্যবহার করে এবং সংরক্ষণ করা পদ্ধতিতে পরবর্তীতে আনা হয়। OFFSET কীওয়ার্ড - যদি আমরা ধারা অনুসারে অর্ডার দিয়ে অফসেট ব্যবহার করি তবে প্রশ্নটি অফসেট এন সারিতে নির্দিষ্ট রেকর্ডগুলির সংখ্যা এড়িয়ে যাবে।

FETCH NEXT কীওয়ার্ড - যখন আমরা কোনও ক্রম অনুসারে কোনও আদেশের সাথে Fetch Next ব্যবহার করি তখন এটি কোনওও সারির সারি ফেরত দেবে না যা আপনি পৃষ্ঠাতে প্রদর্শন করতে চান, অফসেট ছাড়াই SQL তারপর একটি ত্রুটি উৎপন্ন করবে। এখানে নিচে দেওয়া উদাহরণ।

create procedure sp_paging
(
 @pageno as int,
 @records as int
)
as
begin
declare @offsetcount as int
set @offsetcount=(@pageno-1)*@records
select id,bs,variable from salary order by id offset @offsetcount rows fetch Next @records rows only
end

আপনি অনুসরণ হিসাবে এটি কার্যকর করতে পারেন।

exec sp_paging 2,3




pagination