SQL Server 2005で結果をページングするにはどうすればよいですか?
SQL Server 2000で試しましたが、これを行うための信頼できる方法はありませんでした。SQL Server 2005にメソッドが組み込まれているかどうか疑問に思っていますか?
ページングとは、たとえば、ユーザーをユーザー名で一覧表示する場合、最初の10レコードのみを返し、次に次の10レコードのみを返すことができるようにすることを意味します。
どんな助けでも大歓迎です。
SQL Server 2005で結果をページングするにはどうすればよいですか?
SQL Server 2000で試しましたが、これを行うための信頼できる方法はありませんでした。SQL Server 2005にメソッドが組み込まれているかどうか疑問に思っていますか?
ページングとは、たとえば、ユーザーをユーザー名で一覧表示する場合、最初の10レコードのみを返し、次に次の10レコードのみを返すことができるようにすることを意味します。
どんな助けでも大歓迎です。
関数を使用でき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
等
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
ページングを行う必要がある場合は、通常、一時テーブルも使用します。出力パラメーターを使用して、レコードの総数を返すことができます。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
不幸にもそれを達成するには、別のクエリを実行する必要があると思います。
このページのヘルプを使用して、以前の位置でこれを達成することができました: DotNet2.0でのページング
また、行数を個別に取得することもできます。
ページングのために行うことは次のとおりです。ページングが必要な大きなクエリはすべて、一時テーブルへの挿入としてコード化されています。一時テーブルには、上記の row_number() と同様の方法で機能する ID フィールドがあります。一時テーブルの行数を出力パラメーターに格納して、呼び出し元のコードが総レコード数を認識できるようにします。呼び出しコードは、必要なページと、一時テーブルから選択されるページあたりの行数も指定します。
このようにすることの優れた点は、アプリケーションのすべてのグリッドの上に CSV として返されるレポートからすべての行を取得できる「エクスポート」リンクもあるということです。このリンクは同じストアド プロシージャを使用します。ページング ロジックを実行する代わりに、一時テーブルの内容を返すだけです。これは、ページングが嫌いで、すべてを見たいと思っていて、何百万もの異なる方法で並べ替えたいと思っているユーザーをなだめます.