سؤال

كيف يمكنني صفحة النتائج في SQL Server 2005؟

لقد حاولت ذلك في SQL Server 2000، ولكن لم تكن هناك طريقة موثوقة للقيام بذلك.أتساءل الآن عما إذا كان لدى SQL Server 2005 أي طريقة مضمنة؟

ما أعنيه بالترحيل هو، على سبيل المثال، إذا قمت بإدراج المستخدمين حسب اسم المستخدم الخاص بهم، فأنا أريد أن أتمكن من إرجاع السجلات العشرة الأولى فقط، ثم السجلات العشرة التالية وما إلى ذلك.

أي مساعدة سيكون محل تقدير كبير.

هل كانت مفيدة؟

المحلول

يمكنك استخدام 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

إلخ

نصائح أخرى

إذا كنت تحاول الحصول عليه في عبارة واحدة (الإجمالي بالإضافة إلى الترحيل).قد تحتاج إلى استكشاف دعم 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

الإجابة المقبولة لهذا لا تناسبني في الواقع...اضطررت إلى القفز من خلال حلقة أخرى حتى أتمكن من العمل.

عندما حاولت الإجابة

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

وبعد ذلك عملت.

عندما أحتاج إلى إجراء الترحيل، عادةً ما أستخدم جدولًا مؤقتًا أيضًا.يمكنك استخدام معلمة الإخراج لإرجاع العدد الإجمالي للسجلات.تسمح لك عبارات الحالة في التحديد بفرز البيانات في أعمدة محددة دون الحاجة إلى اللجوء إلى 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 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

أعتقد أنك ستحتاج إلى إجراء استعلام منفصل لإنجاز ذلك لسوء الحظ.

لقد تمكنت من تحقيق ذلك في منصبي السابق باستخدام بعض المساعدة من هذه الصفحة:الترحيل في الدوت نت 2.0

لديهم أيضًا سحب عدد الصفوف بشكل منفصل.

إليك ما أفعله للترحيل:يتم ترميز جميع استعلاماتي الكبيرة التي تحتاج إلى ترحيلها إلى صفحات على شكل إدراجات في جدول مؤقت.يحتوي الجدول المؤقت على حقل هوية يعمل بطريقة مشابهة لـrow_number() المذكور أعلاه.أقوم بتخزين عدد الصفوف في الجدول المؤقت في معلمة إخراج حتى يعرف رمز الاتصال عدد السجلات الإجمالية الموجودة.يحدد رمز الاتصال أيضًا الصفحة التي يريدها، وعدد الصفوف لكل صفحة، والتي يتم تحديدها من الجدول المؤقت.

والشيء الرائع في القيام بذلك بهذه الطريقة هو أن لدي أيضًا رابط "تصدير" يسمح لك بإرجاع جميع الصفوف من التقرير كملف CSV فوق كل شبكة في تطبيقي.يستخدم هذا الارتباط نفس الإجراء المخزن:ما عليك سوى إرجاع محتويات الجدول المؤقت بدلاً من القيام بمنطق الترحيل.وهذا يرضي المستخدمين الذين يكرهون الترحيل، ويريدون رؤيته كل شئ, ، وتريد فرزها بمليون طريقة مختلفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top