41

SQL Server 2005で結果をページングするにはどうすればよいですか?

SQL Server 2000で試しましたが、これを行うための信頼できる方法はありませんでした。SQL Server 2005にメソッドが組み込まれているかどうか疑問に思っていますか?

ページングとは、たとえば、ユーザーをユーザー名で一覧表示する場合、最初の10レコードのみを返し、次に次の10レコードのみを返すことができるようにすることを意味します。

どんな助けでも大歓迎です。

4

6 に答える 6

35

関数を使用でき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

于 2008-08-05T20:59:21.563 に答える
13

1 つのステートメント (合計とページング) で取得しようとしている場合。partition by 句 (ANSI SQL 用語のウィンドウ関数) に対する SQL Server のサポートを調査する必要がある場合があります。Oracle での構文は、row_number() を使用した上記の例とまったく同じですが、partition by 句も追加して、ページングで返される各行に含まれる行の総数を取得しました (合計行数は 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' があり、パーティション by が所有者であることに注意してください。したがって、結果は次のとおりです。

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
于 2008-08-14T17:15:31.997 に答える
2

ページングを行う必要がある場合は、通常、一時テーブルも使用します。出力パラメーターを使用して、レコードの総数を返すことができます。select の case ステートメントを使用すると、動的 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
于 2008-09-16T16:17:24.913 に答える
0

不幸にもそれを達成するには、別のクエリを実行する必要があると思います。

このページのヘルプを使用して、以前の位置でこれを達成することができました: DotNet2.0でのページング

また、行数を個別に取得することもできます。

于 2008-08-05T21:05:10.863 に答える
0

ページングのために行うことは次のとおりです。ページングが必要な大きなクエリはすべて、一時テーブルへの挿入としてコード化されています。一時テーブルには、上記の row_number() と同様の方法で機能する ID フィールドがあります。一時テーブルの行数を出力パラメーターに格納して、呼び出し元のコードが総レコード数を認識できるようにします。呼び出しコードは、必要なページと、一時テーブルから選択されるページあたりの行数も指定します。

このようにすることの優れた点は、アプリケーションのすべてのグリッドの上に CSV として返されるレポートからすべての行を取得できる「エクスポート」リンクもあるということです。このリンクは同じストアド プロシージャを使用します。ページング ロジックを実行する代わりに、一時テーブルの内容を返すだけです。これは、ページングが嫌いで、すべてを見たいと思っていて、何百万もの異なる方法で並べ替えたいと思っているユーザーをなだめます.

于 2008-08-13T14:16:13.813 に答える