পেজিং SQL সার্ভার 2005 ফলাফল

কিভাবে আমি SQL সার্ভার 2005 পৃষ্ঠা ফলাফল করবেন?

আমি এসকিউএল সার্ভার 2000 সালে এটি চেষ্টা, কিন্তু এই করতে কোন নির্ভরযোগ্য উপায় ছিল। আমি এখন ভাবছি SQL সার্ভার 2005 কোন পদ্ধতিতে নির্মিত হয়েছে?

উদাহরণস্বরূপ, পেজিং দ্বারা আমি কি বলতে চাই, যদি ব্যবহারকারীদের ব্যবহারকারীর নাম তালিকাভুক্ত করি, তাহলে আমি কেবলমাত্র 10 টি রেকর্ড, তারপর পরবর্তী 10 টি রেকর্ড এবং এভাবেই ফিরে যেতে চাই।

কোন সাহায্যের অনেক প্রশংসা হবে।

0
ro fr hi

6 উত্তর

আপনি Row_Number() ফাংশন ব্যবহার করতে পারেন। এটি নিম্নরূপ ব্যবহৃত:

SELECT Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName
FROM Users

যার থেকে এটি একটি ROWID ক্ষেত্রের সাথে একটি ফলাফল তৈরি করবে যা আপনি পৃষ্ঠাটির মধ্যে ব্যবহার করতে পারেন।

SELECT * 
FROM 
    ( SELECT Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName
      FROM Users 
    ) As RowResults
WHERE RowID Between 5 AND 10

ইত্যাদি

0
যোগ
এই উত্তর আমার জন্য কাজ করে না, যদিও এটি আমাকে আরও কাছাকাছি পেয়েছে এটি অভিযোগ করে যে এটি ROWID কি জানেন না। অতিরিক্ত তথ্যের জন্য নীচের আমার উত্তর দেখুন, আপনি একই সমস্যা আছে, যদি।
যোগ লেখক Beska, উৎস
চমৎকার, সহজ উদাহরণ প্যাট - ঠিক কি পরে আমি :)
যোগ লেখক Town, উৎস
ভিতরের নির্বাচন, আপনি শীর্ষ এক্স সারি নির্বাচন করতে পারেন (এক্স = সর্বোচ্চ সারি চেয়েছিলেন, এই ক্ষেত্রে - 10)। এটি ক্যোয়ারীর গতির উন্নতি করবে।
যোগ লেখক Faruz, উৎস
আমার উপরে মন্তব্যকারী হিসাবে উল্লিখিত, এই কোড কর্মক্ষমতা উন্নত <�কোড> শীর্ষ </কোড> ভেতরের টেবিলে: <�কোড> নির্বাচন শীর্ষ 10 Row_Number() উপর ... আপনি শুধুমাত্র দখল করা হবে সম্পূর্ণ টেবিলের পরিবর্তে সারিগুলির প্রয়োজন হবে।
যোগ লেখক Doug S, উৎস

আমি বিশ্বাস করি যে আপনি অবিশ্বাস্যভাবে এটি সম্পন্ন করার জন্য একটি পৃথক ক্যোয়ারী সম্পাদন করতে হবে।

I was able to accomplish this at my previous position using some help from this page: Paging in DotNet 2.0

তারা এটি পৃথকভাবে একটি সারি গণনা pulling আছে।

0
যোগ

এখানে পেজের জন্য আমি যা করছি: যে সমস্ত বড় প্রশ্নগুলি প্যাড করা দরকার সেগুলিকে একটি টেম্প টেবিলে সন্নিবেশ হিসাবে কোডেড করা হয়। টেম্প টেবিলটিতে একটি পরিচয় ক্ষেত্র রয়েছে যা উপরে বর্ণিত row_number() এর অনুরূপভাবে কাজ করবে। আমি একটি আউটপুট প্যারামিটার মধ্যে টেম্প টেবিল মধ্যে সারি সংখ্যা সংরক্ষণ তাই কলিং কোড কত মোট রেকর্ড আছে জানে। কলিং কোডটি এটি নির্দিষ্ট করে কোন পৃষ্ঠাটি নির্দিষ্ট করে এবং কত পৃষ্ঠাতে সারি, যা টেম্প টেবিল থেকে নির্বাচন করা হয়েছে তা নির্দিষ্ট করে।

এটি এই পদ্ধতি সম্পর্কে শীতল জিনিস যে আমি একটি এক্সপোর্ট "লিঙ্ক" আছে যে আপনি আমার আবেদন প্রতিটি গ্রীড উপরে CSV হিসাবে ফিরে রিপোর্ট থেকে সমস্ত সারি পেতে পারবেন। এই লিংক একই সংরক্ষিত পদ্ধতি ব্যবহার করে: আপনি শুধু পজিশন যুক্তিবিজ্ঞান করছেন পরিবর্তে temp সারণির বিষয়বস্তু ফিরে। এই ব্যবহারকারীদের পেজিং ঘৃণা করে, এবং সবকিছু দেখতে চাই, এবং মিলিয়ন বিভিন্ন উপায়ে এটি সাজানোর করতে চান।

0
যোগ

এই জন্য গৃহীত উত্তর আসলে আমার জন্য কাজ করে না ... আমি এটি কাজ পেতে একটি আরও হুপ মাধ্যমে ঝাঁপ ছিল।

যখন আমি উত্তরটি চেষ্টা করেছি

SELECT Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName
FROM Users
WHERE RowID Between 0 AND 9

এটা ব্যর্থ হয়েছে, অভিযোগ করা হচ্ছে যে এটি ROWID কি ছিল না জানি না।

আমি এই মত একটি ভিতরের নির্বাচন এটি মোড়ানো ছিল:

SELECT * 
FROM
    (SELECT
    Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName
    FROM Users
    ) innerSelect
WHERE RowID Between 0 AND 9

এবং তারপর এটি কাজ।

0
যোগ

আপনি যদি একটি বিবৃতিতে এটি পেতে চেষ্টা করছেন (মোট প্লাস পেজিং)। আপনি ক্লায়েন্ট দ্বারা পার্টিশনের জন্য SQL সার্ভার সমর্থন অন্বেষণ করতে প্রয়োজন হতে পারে (ANSI এসকিউএল শর্তাবলী উইন্ডোজিং ফাংশন)। ওরেলেলে সিনট্যাক্স row_number() ব্যবহার করে উপরের উদাহরণের মতই, কিন্তু আমি পজিশন দ্বারা একটি পার্টিশন যোগ করেছি যা পজিশনে (মোট সারিগুলি 1,২6২) প্রদত্ত সারিগুলির সাথে যোগ করা মোট সারিগুলির সংখ্যা পাওয়া যায়:

SELECT rn, total_rows, x.OWNER, x.object_name, x.object_type
FROM (SELECT COUNT (*) OVER (PARTITION BY owner) AS TOTAL_ROWS,
         ROW_NUMBER() OVER (ORDER BY 1) AS rn, uo.*
         FROM all_objects uo
         WHERE owner = 'CSEIS') x
WHERE rn BETWEEN 6 AND 10

মনে রাখবেন যে মালিকের মালিক = 'সিএসআইআইএস' এবং আমার পার্টিশন মালিকের উপর। তাই ফলাফলগুলি হল:

RN  TOTAL_ROWS  OWNER   OBJECT_NAME            OBJECT_TYPE
6   1262    CSEIS   CG$BDS_MODIFICATION_TYPES   TRIGGER
7   1262    CSEIS   CG$AUS_MODIFICATION_TYPES   TRIGGER
8   1262    CSEIS   CG$BDR_MODIFICATION_TYPES   TRIGGER
9   1262    CSEIS   CG$ADS_MODIFICATION_TYPES   TRIGGER
10  1262    CSEIS   CG$BIS_LANGUAGES            TRIGGER
0
যোগ
+1 আমি একটি টেম্প টেবিল ব্যবহার না করে মোট সারি এবং পৃষ্ঠা পেতে কিভাবে আশ্চর্য ছিল। ধন্যবাদ !!
যোগ লেখক dotjoe, উৎস
+1 ... সুন্দর এখন এটির সাথে খেলতে :-) আপনি কি COUNT (*) ওভার (...) ব্যবহার করে কোনও পারফরম্যান্সটি জানেন?
যোগ লেখক Chris J, উৎস
+1 সুন্দর - এটি COUNT (*) ওভার ব্যবহার করে sqlserver তে কাজ করে (নূ্যনীত অংশ)
যোগ লেখক Hafthor, উৎস
সাধারণভাবে, আপনি এসকিউএলতে যা কিছু করতে পারেন সেটিই সবচেয়ে ভাল বিকল্প হবে। অন্য কথায়, আপনি 'একক' এসকিউএল কোয়েরি-তে যা কিছু করতে পারেন তা সম্ভবত জাভা / পল / এসকিউএল সি # এর চেয়ে আরও বেশি প্রোগ্রামারিক পদ্ধতি অনুসরণ করবে। যত তাড়াতাড়ি সম্ভব মিঃ কিট পড়ুন: tkyte.blogspot.com/2006 /10/slow-by-slow.html
যোগ লেখক Brian, উৎস

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

--Declaration--

--Variables
@StartIndex INT,
@PageSize INT,
@SortColumn VARCHAR(50),
@SortDirection CHAR(3),
@Results INT OUTPUT

--Statements--
SELECT @Results = COUNT(ID) FROM Customers
WHERE FirstName LIKE '%a%'

SET @StartIndex = @StartIndex - 1 --Either do this here or in code, but be consistent
CREATE TABLE #Page(ROW INT IDENTITY(1,1) NOT NULL, id INT, sorting_1 SQL_VARIANT, sorting_2 SQL_VARIANT)
INSERT INTO #Page(ID, sorting_1, sorting_2)
SELECT TOP (@StartIndex + @PageSize)
    ID,
    CASE
        WHEN @SortColumn='FirstName' AND @SortDirection='ASC' THEN CAST(FirstName AS SQL_VARIANT)
        WHEN @SortColumn='LastName' AND @SortDirection='ASC' THEN CAST(LastName AS SQL_VARIANT)
        ELSE NULL
    END AS sort_1,
    CASE
        WHEN @SortColumn='FirstName' AND @SortDirection='DES' THEN CAST(FirstName AS SQL_VARIANT)
        WHEN @SortColumn='LastName' AND @SortDirection='DES' THEN CAST(LastName AS SQL_VARIANT)
        ELSE NULL
    END AS sort_2
FROM (
    SELECT
        CustomerId AS ID,
        FirstName,
        LastName
    FROM Customers
    WHERE
        FirstName LIKE '%a%'
) C
ORDER BY sort_1 ASC, sort_2 DESC, ID ASC;

SELECT
    ID,
    Customers.FirstName,
    Customers.LastName
FROM #Page
INNER JOIN Customers ON
    ID = Customers.CustomerId
WHERE ROW > @StartIndex AND ROW <= (@StartIndex + @PageSize)
ORDER BY ROW ASC

DROP TABLE #Page
0
যোগ
এটি আপনি SQL সার্ভার 2000 এ করবেন কি না, তবে 2005 সংস্করণে ROW_NUMBER ফাংশন ব্যবহার করে একটি ভাল সমাধান রয়েছে।
যোগ লেখক niaher, উৎস