এসকিউএল সার্ভার ২০০০, ২০০ 2008, ২০০৮, ২০১২-এ ফলাফলের উত্সাহিত করার সর্বোত্তম উপায় (পারফরম্যান্স ওয়াইস) কোনটি যদি আপনিও মোট ফলাফলের সংখ্যা (পৃষ্ঠায়িত করার আগে) পেতে চান?
এসকিউএল সার্ভার ২০০০, ২০০ 2008, ২০০৮, ২০১২-এ ফলাফলের উত্সাহিত করার সর্বোত্তম উপায় (পারফরম্যান্স ওয়াইস) কোনটি যদি আপনিও মোট ফলাফলের সংখ্যা (পৃষ্ঠায়িত করার আগে) পেতে চান?
উত্তর:
মোট ফলাফলের সংখ্যা পাওয়া এবং পৃষ্ঠাবদ্ধকরণ দুটি পৃথক ক্রিয়াকলাপ। এই উদাহরণের স্বার্থে, ধরে নেওয়া যাক আপনি যে ক্যোয়ারীটি নিয়ে কাজ করছেন তা হ'ল
SELECT * FROM Orders WHERE OrderDate >= '1980-01-01' ORDER BY OrderDate
এই ক্ষেত্রে, আপনি ব্যবহারের ফলাফলের মোট সংখ্যা নির্ধারণ করবেন:
SELECT COUNT(*) FROM Orders WHERE OrderDate >= '1980-01-01'
... যা অকার্যকর বলে মনে হতে পারে তবে সমস্ত সূচক ইত্যাদি সঠিকভাবে সেট আপ করা আছে তা ধরে নিচ্ছি pretty
এরপরে, পেজযুক্ত ফ্যাশনে প্রকৃত ফলাফল ফিরে পেতে, নিম্নলিখিত কোয়েরিটি সবচেয়ে কার্যকর হবে:
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 টি সারিগুলি ফিরিয়ে দেবে। এখানে দুর্দান্ত জিনিসটি, বিশেষত ওয়েব অ্যাপ্লিকেশনগুলির জন্য হ'ল সারি নম্বরগুলি ফেরত পাঠানো ছাড়া আপনাকে কোনও রাজ্য রাখতে হবে না।
অবশেষে, মাইক্রোসফ্ট এসকিউএল সার্ভার ২০১২ প্রকাশিত হয়েছিল, আমি পৃষ্ঠাটির জন্য এর সরলতাটি সত্যিই পছন্দ করি, আপনার এখানে উত্তর হিসাবে জটিল প্রশ্নগুলি ব্যবহার করতে হবে না।
পরবর্তী 10 টি সারি পাওয়ার জন্য এই কোয়েরিটি চালান:
SELECT * FROM TableName ORDER BY id OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
এটি ব্যবহার করার সময় বিবেচনা করার জন্য মূল বিষয়গুলি:
ORDER BY
OFFSET ... FETCH
ধারা ব্যবহার করা বাধ্যতামূলক ।OFFSET
ধারা সহ বাধ্যতামূলক FETCH
। আপনি ব্যবহার করতে পারবেন না ORDER BY ...
FETCH
।TOP
একই কোয়েরি এক্সপ্রেশনটির সাথে OFFSET
এবং একত্রিত করা যায় না FETCH
।LISTAGG()
/ GROUP_CONCAT()
।
FOR XML
: stackoverflow.com/a/273330/429949
FOR XML PATH ('')
। প্রথমত, এটি এক্সএমএল নিয়ন্ত্রণ অক্ষরগুলিকে এক্সএমএল সত্তা কোডগুলির সাথে প্রতিস্থাপন করে। আশা করি আপনি না <
, >
অথবা &
আপনার ডেটা রয়েছে! দ্বিতীয়ত, FOR XML PATH ('')
এই পদ্ধতিতে ব্যবহৃত হ'ল প্রকৃতপক্ষে বিন্যস্ত সিনট্যাক্স। আপনি একটি নামযুক্ত কলাম বা একটি বিকল্প উপাদান নাম উল্লেখ করার কথা। উভয়ই করণীয় নথিতে নেই, আচরণটি বিশ্বাসযোগ্য নয়। তৃতীয়ত, আমরা ভাঙা FOR XML PATH ('')
বাক্য গঠনটি যত বেশি গ্রহণ করি , এমএস তাদের প্রয়োজন মতো প্রকৃত LISTAGG() [ OVER() ]
ফাংশন সরবরাহ করার সম্ভাবনা কম থাকে ।
অবিশ্বাস্যরূপে, অন্য কোনও উত্তর সমস্ত এসকিউএল সার্ভার সংস্করণে পৃষ্ঠা-রচনা করার দ্রুততম উপায়টির কথা উল্লেখ করেনি । এখানে বেঞ্চমার্ক অনুসারে অফসেটগুলি বড় পৃষ্ঠা সংখ্যার জন্য মারাত্মকভাবে ধীর হতে পারে । এসকিউএল এ পৃষ্ঠাগুলি সম্পাদন করার জন্য সম্পূর্ণ আলাদা, অনেক দ্রুত উপায় রয়েছে। এখানে এই ব্লগ পোস্টে বর্ণিত হিসাবে এটি প্রায়শই "সিক মেথড" বা "কীসেট প্যাগ্রেশন" নামে পরিচিত ।
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 পৃষ্ঠায় আপনি পৃষ্ঠায় আছেন)।
উদাহরণস্বরূপ, ওয়েব অ্যাপ্লিকেশনগুলিতে অলস বেশি ডেটা লোড করার সময় পৃষ্ঠাগুলি প্রয়োগের সর্বোত্তম উপায়।
দ্রষ্টব্য, " সন্ধানের পদ্ধতি" কে কীসেট প্যাফিকেশনও বলা হয় ।
COUNT(*) OVER()
উইন্ডো ফাংশন আপনি "পত্রাঙ্কন আগে" মোট রেকর্ডের সংখ্যা গণনা করতে সাহায্য করবে। আপনি যদি এসকিউএল সার্ভার 2000 ব্যবহার করেন তবে আপনাকে এর জন্য দুটি ক্যোয়ারির অবলম্বন করতে হবে COUNT(*)
।
OFFSET .. FETCH
বা অফারিক ROW_NUMBER()
ট্রিকস দিয়ে অফসেট পেজিং বাস্তবায়ন করেন না তা বিবেচনা করুন ।
RowNumber
পেয়েছি আমাকে প্রতি পৃষ্ঠায় ধারাবাহিক 10 আইটেম দেয়। [3] এটি বিদ্যমান গ্রিডগুলির সাথে কাজ করে না pagenumber
এবং ধরে নেয় pagesize
।
এসকিউএল সার্ভার থেকে 2012, আমরা ব্যবহার করতে পারি OFFSET
এবংFETCH NEXT
পৃষ্ঠাগুলি অর্জনের জন্য ক্লজ ।
এসকিউএল সার্ভারের জন্য এটি ব্যবহার করে দেখুন:
এসকিউএল সার্ভার ২০১২ সালে অর্ডার বাই দফায় একটি নতুন বৈশিষ্ট্য যুক্ত করা হয়েছিল, যাতে কোনও এস -কিউএল-তে লেখার পাশাপাশি এসকিউএল সার্ভারে সম্পূর্ণ এক্সিকিউশন প্ল্যানের জন্য ডেটা পেজিংয়ের কাজ সহজ করে তোলে, সেট সেটটির অপ্টিমাইজেশান অনুসন্ধানের জন্য।
আগের উদাহরণটিতে ব্যবহৃত একই যুক্তি সহ টি-এসকিউএল স্ক্রিপ্টের নীচে।
--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;
টেকনেট: এসকিউএল সার্ভারের সাহায্যে একটি প্রশ্নের পেজিং করা হচ্ছে
এমএসডিএন: ROW_NUMBER (লেনদেন-এসকিউএল)
প্রতিটি বিভাগে প্রথম সারির জন্য 1 থেকে শুরু করে ফলাফল সেটের একটি পার্টিশনের মধ্যে একটি সারির ক্রমিক সংখ্যা প্রদান করে।
নিম্নলিখিত উদাহরণটি অর্ডারডেটের ক্রমে 50 থেকে 60 নম্বর সহ সারিগুলি প্রদান করে।
WITH OrderedOrders AS
(
SELECT
ROW_NUMBER() OVER(ORDER BY FirstName DESC) AS RowNumber,
FirstName, LastName, ROUND(SalesYTD,2,1) AS "Sales YTD"
FROM [dbo].[vSalesPerson]
)
SELECT RowNumber,
FirstName, LastName, Sales YTD
FROM OrderedOrders
WHERE RowNumber > 50 AND RowNumber < 60;
RowNumber FirstName LastName SalesYTD
--- ----------- ---------------------- -----------------
1 Linda Mitchell 4251368.54
2 Jae Pak 4116871.22
3 Michael Blythe 3763178.17
4 Jillian Carson 3189418.36
5 Ranjit Varkey Chudukatil 3121616.32
6 José Saraiva 2604540.71
7 Shu Ito 2458535.61
8 Tsvi Reiter 2315185.61
9 Rachel Valdez 1827066.71
10 Tete Mensa-Annan 1576562.19
11 David Campbell 1573012.93
12 Garrett Vargas 1453719.46
13 Lynn Tsoflias 1421810.92
14 Pamela Ansman-Wolfe 1352577.13
এখানে বিভিন্ন পেজিং কৌশলগুলির একটি ভাল ওভারভিউ রয়েছে Http://www.codeproject.com/KB/aspnet/PasingLarge.aspx
আমি প্রায়শই প্রায়শই এসকিউএল সার্ভার 2000 এর সাথে ROWCOUNT পদ্ধতি ব্যবহার করেছি (2005 এবং ২০০৮ এর সাথেও কাজ করবে, কেবল ROW_NUMBER এর সাথে তুলনা করে পারফরম্যান্সটি পরিমাপ করবে) এটি দ্রুত বজ্রপাতযুক্ত, তবে আপনাকে অবশ্যই নিশ্চিত করা দরকার যে সাজানো কলামগুলি (গুলি) বেশিরভাগই রয়েছে (বেশিরভাগ ক্ষেত্রেই) ) অনন্য মান।
এসকিউএল সার্ভার 2000 এর জন্য আপনি একটি আইডেন্টিটি কলাম সহ একটি টেবিল ভেরিয়েবল ব্যবহার করে 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
এই পদ্ধতিটি বহু-কলাম কীগুলির সাহায্যে টেবিলগুলিতে প্রসারিত হতে পারে এবং এটি ওআর (যা সূচক ব্যবহারকে বাদ দেয়) ব্যবহারের উপরের পারফরম্যান্সকে ব্যয় করে না। ডাউনসাইড হ'ল ডেটা সেটটি খুব বড় এবং একটি শেষ পৃষ্ঠার নিকটে থাকলে অস্থায়ী জায়গার পরিমাণ। আমি সেক্ষেত্রে কার্সার পারফরম্যান্স পরীক্ষা করিনি তবে এটি আরও ভাল হতে পারে।
নোট করুন যে এই পদ্ধতির ডেটা প্রথম পৃষ্ঠার জন্য অনুকূলিত করা যেতে পারে। এছাড়াও, যেহেতু শীর্ষস্থানীয় এসকিউএল সার্ভার 2000-এ কোনও পরিবর্তনশীল গ্রহণ করে না তাই ROWCOUNT ব্যবহার করা হয়েছিল।
এসকিএল সার্ভার 2012-এ পেজিংয়ের সর্বোত্তম উপায় হ'ল স্টোরেজ পদ্ধতিতে পরবর্তী অফসেট ব্যবহার এবং আনা। অফসেট কীওয়ার্ড - আমরা যদি ধারা দ্বারা আদেশ সহ অফসেট ব্যবহার করি তবে কোয়েরিটি অফসেট এন সারিগুলিতে বর্ণিত রেকর্ডের সংখ্যাটি এড়িয়ে যাবে।
ফিচার নেক্সট কীওয়ার্ডস - যখন আমরা কেবল ধারা অনুসারে একটি অর্ডার সহ ন্যাশনাল ফ্যাচ ব্যবহার করি তখন এটি অফসেট ছাড়াই আপনি পেজিংয়ে প্রদর্শিত সারিগুলির যে কোনও সারি প্রদান করবে তা এসকিউএল ত্রুটি উত্পন্ন করবে। এখানে নীচে দেওয়া উদাহরণ।
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
এসকিউএল সার্ভারের পাশে ক্যোয়ারির ফলাফলটি পেজ করার জন্য এটি আমার সমাধান are এসকিউএল সার্ভার ২০০৮ এবং ২০১২ সালের মধ্যে এই পদ্ধতিগুলি পৃথক Also এছাড়াও, আমি একটি কলাম দিয়ে ফিল্টারিং এবং অর্ডার ধারণাটি যুক্ত করেছি। আপনি যখন গ্রিডভিউতে পেজিং এবং ফিল্টারিং এবং অর্ডার করছেন তখন এটি খুব কার্যকর efficient
পরীক্ষার আগে, আপনাকে একটি নমুনা সারণী তৈরি করতে হবে এবং এই টেবিলটিতে কিছু সারি প্রবেশ করতে হবে: (বাস্তব বিশ্বে আপনাকে আপনার টেবিলের ক্ষেত্রগুলি বিবেচনা করে ক্লজটি পরিবর্তন করতে হবে এবং সম্ভবত নির্বাচনের মূল অংশে আপনার কিছু যোগদান এবং উপসূত্র রয়েছে)
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 টি সারি জিজ্ঞাসা করতে চাই এবং আমি পৃষ্ঠা 1200 এর জন্য সারিটি আনছি।
এসকিউএল সার্ভার ২০০৮ এ আপনি সিটিই ধারণাটি ব্যবহার করতে পারেন। সে কারণে, আমি এসকিউএল সার্ভার ২০০++ এর জন্য দুটি ধরণের ক্যোয়ারী লিখেছি
- এসকিউএল সার্ভার ২০০+
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
এবং এসকিউএল সার্ভার ২০০++ এ সিটিইর সাথে দ্বিতীয় সমাধান
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;
নিম্নলিখিত ক্ষেত্রে ব্যবহার করা সহজ এবং দ্রুত বলে মনে হয়। কেবল পৃষ্ঠা নম্বর সেট করুন।
use AdventureWorks
DECLARE @RowsPerPage INT = 10, @PageNumber INT = 6;
with result as(
SELECT SalesOrderDetailID, SalesOrderID, ProductID,
ROW_NUMBER() OVER (ORDER BY SalesOrderDetailID) AS RowNum
FROM Sales.SalesOrderDetail
where 1=1
)
select SalesOrderDetailID, SalesOrderID, ProductID from result
WHERE result.RowNum BETWEEN ((@PageNumber-1)*@RowsPerPage)+1
AND @RowsPerPage*(@PageNumber)
সিটিই ছাড়াও
use AdventureWorks
DECLARE @RowsPerPage INT = 10, @PageNumber INT = 6
SELECT SalesOrderDetailID, SalesOrderID, ProductID
FROM (
SELECT SalesOrderDetailID, SalesOrderID, ProductID,
ROW_NUMBER() OVER (ORDER BY SalesOrderDetailID) AS RowNum
FROM Sales.SalesOrderDetail
where 1=1
) AS SOD
WHERE SOD.RowNum BETWEEN ((@PageNumber-1)*@RowsPerPage)+1
AND @RowsPerPage*(@PageNumber)
আমি আমার এসকিউএল 2000 ডাটাবেসে নিম্নলিখিত নমুনা কোয়েরিটি ব্যবহার করেছি, এটি এসকিউএল 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 ক্যাশে পরে কলগুলি, যদি আপনি একই প্যারামিটারগুলি পাস করেন অর্থাৎ একই এসকিউএল পাঠ্য উত্পন্ন করেন।
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 এ আসে
জন্য ROW_NUMBER
কৌশল, যদি আপনি ব্যবহার করার একটা ঝোঁক বাছাই কলাম নেই, আপনি ব্যবহার করতে পারেন CURRENT_TIMESTAMP
নিম্নরূপ:
SELECT TOP 20
col1,
col2,
col3,
col4
FROM (
SELECT
tbl.col1 AS col1
,tbl.col2 AS col2
,tbl.col3 AS col3
,tbl.col4 AS col4
,ROW_NUMBER() OVER (
ORDER BY CURRENT_TIMESTAMP
) AS sort_row
FROM dbo.MyTable tbl
) AS query
WHERE query.sort_row > 10
ORDER BY query.sort_row
এমনকি 700,000 অবধি টেবিল আকারের অনুসন্ধানের জন্য এটি আমার পক্ষে ভাল কাজ করেছে।
এটি রেকর্ড 11 থেকে 30 এনেছে।
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
এই বিটটি আপনাকে এসকিউএল সার্ভার এবং মাইএসকিউএল এর নতুন সংস্করণগুলি ব্যবহার করে প্যাগিট করার ক্ষমতা দেয় এবং প্রতিটি সারিতে মোট সারির সংখ্যা বহন করে। অনন্য সারি সংখ্যা গণনা করতে আপনার পিমারি কী ব্যবহার করে।
WITH T AS
(
SELECT TABLE_ID, ROW_NUMBER() OVER (ORDER BY TABLE_ID) AS RN
, (SELECT COUNT(TABLE_ID) FROM TABLE) AS TOTAL
FROM TABLE (NOLOCK)
)
SELECT T2.FIELD1, T2.FIELD2, T2.FIELD3, T.TOTAL
FROM TABLE T2 (NOLOCK)
INNER JOIN T ON T2.TABLE_ID=T.TABLE_ID
WHERE T.RN >= 100
AND T.RN < 200
এটি 2012 এর পুরানো এসও প্রশ্নের সদৃশ: পেজিং বাস্তবায়নের কার্যকর উপায়
[টেবিলএক্স] অর্ডার থেকে [ফিল্ডএক্স] 500 টি পাখি ফিচারটি পরবর্তী 100 টি সারি মাত্র
এখানে বিষয়টি আরও বিশদে এবং বিকল্প পদ্ধতির সাথে আলোচনা করা হয়েছে।
আপনি কোন ভাষা এবং কোন ড্রাইভার ব্যবহার করছেন তা নির্দিষ্ট করে নি। অতএব আমি এটি বিমূর্ত বর্ণনা করছি।