2008-08-05 9 views
36

मैं SQL सर्वर 2005 में पृष्ठ का परिणाम कैसे प्राप्त करूं?पेजिंग SQL सर्वर 2005 परिणाम

मैंने इसे SQL Server 2000 में आज़माया, लेकिन ऐसा करने का कोई विश्वसनीय तरीका नहीं था। अब मैं सोच रहा हूं कि SQL सर्वर 2005 में कोई भी विधि निर्मित है या नहीं?

पेजिंग द्वारा मेरा क्या मतलब है, उदाहरण के लिए, यदि मैं उपयोगकर्ताओं को उनके उपयोगकर्ता नाम से सूचीबद्ध करता हूं, तो मैं केवल पहले 10 रिकॉर्ड, फिर अगले 10 रिकॉर्ड और फिर वापस लौटने में सक्षम होना चाहता हूं।

किसी भी मदद की बहुत सराहना की जाएगी।

उत्तर

33

आप the 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

उत्कृष्ट, सरल उदाहरण पैट - ठीक उसी के बाद मैं क्या था :) – Town

+0

यह उत्तर मेरे लिए काम नहीं करता है, हालांकि यह मुझे करीब ले गया है। यह शिकायत करता है कि यह नहीं जानता कि रोविड क्या है। यदि आपको एक ही समस्या है, तो अतिरिक्त जानकारी के लिए नीचे मेरा उत्तर देखें। – Beska

+2

आंतरिक चयन में, आप शीर्ष एक्स पंक्तियों का चयन कर सकते हैं (एक्स = अधिकतम पंक्ति चाहता था, इस मामले में - 10)। यह क्वेरी की गति में सुधार करेगा। – Faruz

0

मेरा मानना ​​है कि आपको लगता है कि पूरा करने के लिए unfortionately एक अलग क्वेरी को निष्पादित करना होगा चाहते हैं। Paging in DotNet 2.0

उन्होंने यह भी यह एक पंक्ति अलग से गिनती खींच है:

मैं इस पेज से कुछ मदद का उपयोग कर अपने पिछले स्थिति में यह पूरा करने में सक्षम था।

0

पेजिंग के लिए मैं जो करता हूं वह यहां है: मेरे सभी बड़े प्रश्नों को पेजेड करने की आवश्यकता है, जिन्हें एक टेम्प टेबल में सम्मिलित किया जाता है। अस्थायी तालिका में एक पहचान फ़ील्ड है जो ऊपर वर्णित row_number() के समान तरीके से कार्य करेगा। मैं आउटपुट पैरामीटर में अस्थायी तालिका में पंक्तियों की संख्या संग्रहीत करता हूं ताकि कॉलिंग कोड जानता है कि कितने कुल रिकॉर्ड हैं। कॉलिंग कोड यह भी निर्दिष्ट करता है कि वह कौन सा पेज चाहता है, और प्रति पृष्ठ कितनी पंक्तियां हैं, जिन्हें temp तालिका से चुना गया है।

इस तरह से करने के बारे में अच्छी बात यह है कि मेरे पास "निर्यात" लिंक भी है जो आपको मेरे आवेदन में प्रत्येक ग्रिड के ऊपर सीएसवी के रूप में लौटाई गई रिपोर्ट से सभी पंक्तियां प्राप्त करने की अनुमति देता है। यह लिंक एक ही संग्रहीत प्रक्रिया का उपयोग करता है: आप केवल पेजिंग तर्क करने के बजाय temp तालिका की सामग्री वापस कर देते हैं। यह उन उपयोगकर्ताओं को परेशान करता है जो पेजिंग से नफरत करते हैं, और सब कुछ देखना चाहते हैं, और इसे दस लाख अलग-अलग तरीकों से सॉर्ट करना चाहते हैं।

13

यदि आप इसे एक कथन (कुल प्लस पेजिंग) में प्राप्त करने का प्रयास कर रहे हैं। आपको विभाजन के लिए SQL सर्वर समर्थन का पता लगाने की आवश्यकता हो सकती है (एएनएसआई एसक्यूएल शब्दों में विंडोिंग फ़ंक्शन)। ओरेकल में वाक्यविन्यास पंक्ति_नंबर() का उपयोग करके ऊपर दिए गए उदाहरण की तरह है, लेकिन मैंने पेजिंग में लौटाई गई प्रत्येक पंक्ति के साथ पंक्तियों की कुल संख्या प्राप्त करने के लिए खंड द्वारा एक विभाजन भी जोड़ा है (कुल पंक्तियां 1,262 है):

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 
+1

+1 मैं सोच रहा था कि कुल पंक्तियों और पृष्ठ को अस्थायी तालिका के बिना कैसे प्राप्त किया जाए। धन्यवाद!! – dotjoe

+2

+1 अच्छा - इसे COUNT (*) ओवर (NULL द्वारा विभाजन) – Hafthor

+1

+1 का उपयोग कर sqlserver पर काम करने के लिए मिला ... अच्छा। अब इसके साथ खेलने के लिए :-) क्या आप COUNT (*) ओवर (...) का उपयोग कर किसी भी प्रदर्शन हिट के बारे में जानते हैं? –

2

जब मुझे पेजिंग करने की आवश्यकता होती है, तो मैं आमतौर पर एक अस्थायी तालिका का भी उपयोग करता हूं। आप रिकॉर्ड की कुल संख्या वापस करने के लिए आउटपुट पैरामीटर का उपयोग कर सकते हैं। चयन में केस स्टेटमेंट्स आपको डायनामिक एसक्यूएल का सहारा लेने के बिना विशिष्ट कॉलम पर डेटा सॉर्ट करने की अनुमति देता है।

--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 
+3

एसक्यूएल सर्वर 2000 में आप यही करेंगे, लेकिन 2005 संस्करण का उपयोग करके बेहतर समाधान है ROW_NUMBER फ़ंक्शन। – niaher

5

इसके लिए स्वीकार्य उत्तर वास्तव में मेरे लिए काम नहीं करता है ... मुझे इसे काम करने के लिए एक और उछाल से कूदना पड़ा।

जब मैं जवाब

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 

और फिर इसे काम किया।