Τηλεειδοποίησης SQL Server 2005 Αποτελέσματα

ψήφοι
36

Πώς μπορώ σελίδα αποτελεσμάτων στον SQL Server 2005;

Το δοκίμασα σε SQL Server 2000, αλλά δεν υπήρχε αξιόπιστος τρόπος για να γίνει αυτό. Είμαι τώρα αναρωτιέμαι αν SQL Server 2005 έχει κάποια ενσωματωμένη μέθοδο;

Τι εννοώ με σελιδοποίησης, για παράδειγμα, αν λίστα χρηστών με το όνομα χρήστη τους, θέλω να είναι σε θέση να επιστρέψει μόνο τα 10 πρώτα στοιχεία, στη συνέχεια, τα επόμενα 10 εγγραφές και ούτω καθεξής.

Οποιαδήποτε βοήθεια θα εκτιμηθεί πολύ.

Δημοσιεύθηκε 05/08/2008 στις 21:57
πηγή χρήστη
Σε άλλες γλώσσες...                            


6 απαντήσεις

ψήφοι
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

και τα λοιπα

Απαντήθηκε 05/08/2008 στις 21:59
πηγή χρήστη

ψήφοι
13

Αν προσπαθείτε να το πάρει σε μια δήλωση (το συνολικό συν το σελιδοποίησης). Ίσως χρειαστεί να εξερευνήσετε την υποστήριξη του SQL Server για το διαμέρισμα με ρήτρα (λειτουργίες παραθύρων σε ANSI όρους SQL). Στο Oracle η σύνταξη είναι ακριβώς όπως το παραπάνω παράδειγμα χρησιμοποιώντας ROW_NUMBER (), αλλά έχω προσθέσει επίσης ένα διαμέρισμα με ρήτρα να πάρει το συνολικό αριθμό των σειρών που περιλαμβάνονται με κάθε σειρά επέστρεψε στην τηλεειδοποίησης (συνολική σειρές είναι 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

Σημειώστε ότι έχω οποία ο ιδιοκτήτης = «CSEIS» και διαμέρισμα μου είναι για τον ιδιοκτήτη. Έτσι, τα αποτελέσματα είναι τα εξής:

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
Απαντήθηκε 14/08/2008 στις 18:15
πηγή χρήστη

ψήφοι
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

και στη συνέχεια δούλεψε.

Απαντήθηκε 15/04/2009 στις 18:56
πηγή χρήστη

ψήφοι
2

Όταν πρέπει να κάνω σελιδοποίησης, εγώ συνήθως χρησιμοποιούν ένα προσωρινό πίνακα, καθώς και. Μπορείτε να χρησιμοποιήσετε μια παράμετρο εξόδου για να επιστρέψει το συνολικό αριθμό των εγγραφών. Οι δηλώσεις περίπτωση της επιλογής σας επιτρέψει να ταξινομήσετε τα δεδομένα σχετικά με συγκεκριμένες στήλες, χωρίς να χρειάζεται να καταφύγουν σε δυναμική SQL.

--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 IGNORE  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
Απαντήθηκε 16/09/2008 στις 17:17
πηγή χρήστη

ψήφοι
0

Εδώ είναι αυτό που κάνω για σελιδοποίησης: Όλα τα μεγάλα μου τα ερωτήματα που πρέπει ν 'αναζητηθεί κωδικοποιούνται ως ένθετα σε έναν πίνακα temp. Ο πίνακας temp έχει ένα πεδίο ταυτότητας που θα ενεργήσει με παρόμοιο τρόπο προς την row_number () που αναφέρθηκαν παραπάνω. Έχω αποθηκεύσει τον αριθμό των σειρών του πίνακα temp σε μια παράμετρος εξόδου έτσι ώστε ο κωδικός κλήσης ξέρει πόσα συνολικά αρχεία είναι εκεί. Ο κωδικός κλήσης καθορίζει επίσης ποια σελίδα θέλει, και πόσες γραμμές ανά σελίδα, οι οποίοι επιλέγονται Από τον πίνακα temp.

Το δροσερό πράγμα για να κάνει αυτό τον τρόπο είναι ότι έχω επίσης ένα σύνδεσμο «Εξαγωγή» που σας επιτρέπει να πάρετε όλες τις γραμμές από την έκθεση επέστρεψε ως CSV πάνω από κάθε δίκτυο στην αίτησή μου. Αυτή η σύνδεση χρησιμοποιεί το ίδιο αποθηκευμένη διαδικασία: απλά επιστρέψει τα περιεχόμενα του πίνακα temp αντί να κάνει τη λογική σελιδοποίησης. Αυτό είναι πλακάκι χρήστες που μισούν σελιδοποίησης, και θέλουν να δουν τα πάντα , και θέλουν να το λύσουμε σε ένα εκατομμύριο διαφορετικούς τρόπους.

Απαντήθηκε 13/08/2008 στις 15:16
πηγή χρήστη

ψήφοι
0

Πιστεύω ότι θα πρέπει να εκτελέσετε ένα ξεχωριστό ερώτημα για να το επιτύχει αυτό unfortionately.

Ήμουν σε θέση να το πετύχουν αυτό στην προηγούμενη θέση μου με κάποια βοήθεια από αυτή τη σελίδα: σελιδοποίησης σε DotNet 2.0

Έχουν, επίσης, τραβώντας μια γραμμή μετράνε χωριστά.

Απαντήθηκε 05/08/2008 στις 22:05
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more