- 註冊時間
- 2006-3-13
- 最後登錄
- 2025-1-10
- 在線時間
- 673 小時
- 閱讀權限
- 200
- 積分
- 417
- 帖子
- 1107
- 精華
- 0
- UID
- 2
  
|
SQL Server 2000 Paging and Sorting Using ROWCOUNT and SQL_VARIANT
http://www.codeproject.com/KB/da ... KPagingSorting.aspx- CREATE PROCEDURE dbo.up_GetSortedSalesOrdersByPageUsingRowset
- @orderedOnStart datetime,
- @orderedOnEnd datetime,
- @pageNumber int,
- @pageSize int,
- @sortExpression varchar(100),
- @sortOrder varchar(4),
- @virtualCount int OUTPUT
- AS
- /*
- Make sure that the page number is at least 1
- */
- IF @pageNumber < 1
- BEGIN
- SET @pageNumber = 1
- END
- SELECT
- @virtualCount = COUNT(*)
- FROM
- Sales.SalesOrderHeader Header
- WHERE
- Header.[OrderDate] >= @orderedOnStart
- AND Header.[OrderDate] < @orderedOnEnd
- DECLARE @lastKeyValue numeric(18,0)
- DECLARE @lastAscendingSortValue SQL_Variant
- DECLARE @lastDescendingSortValue SQL_Variant
- DECLARE @numberToIgnore int
- SET @numberToIgnore = (@pageNumber-1) * @pageSize
- IF @numberToIgnore > 0
- BEGIN
- /*
- Get the last available sort data and unique key
- value from the last page.
- */
- SET ROWCOUNT @numberToIgnore
- SELECT
- @lastKeyValue = [UniqueValue],
- @lastAscendingSortValue = [AscendingSort],
- @lastDescendingSortValue = [DescendingSort]
- FROM
- (
- SELECT
- Header.[SalesOrderID] AS [UniqueValue],
- CASE
- WHEN
- UPPER(@sortOrder) = 'DESC'
- AND UPPER(@sortExpression) = 'CUSTOMERID'
- THEN
- CONVERT(SQL_Variant, [CustomerID])
- WHEN
- UPPER(@sortOrder) = 'DESC'
- AND UPPER(@sortExpression) = 'TOTALDUE'
- THEN
- CONVERT(SQL_Variant, [TotalDue])
- WHEN
- UPPER(@sortOrder) = 'DESC'
- AND UPPER(@sortExpression) = 'ORDERDATE'
- THEN
- CONVERT(SQL_Variant, [OrderDate])
- ELSE
- NULL
- END AS [DescendingSort],
- CASE
- WHEN
- UPPER(@sortOrder) = 'ASC'
- AND UPPER(@sortExpression) = 'CUSTOMERID'
- THEN
- CONVERT(SQL_Variant, [CustomerID])
- WHEN
- UPPER(@sortOrder) = 'ASC'
- AND UPPER(@sortExpression) = 'TOTALDUE'
- THEN
- CONVERT(SQL_Variant, [TotalDue])
- WHEN
- UPPER(@sortOrder) = 'ASC'
- AND UPPER(@sortExpression) = 'ORDERDATE'
- THEN
- CONVERT(SQL_Variant, [OrderDate])
- ELSE
- NULL
- END AS [AscendingSort]
- FROM
- Sales.SalesOrderHeader Header
- WHERE
- Header.[OrderDate] >= @orderedOnStart
- AND Header.[OrderDate] < @orderedOnEnd
- ) AS Derived
- ORDER BY
- [AscendingSort] ASC,
- [DescendingSort] DESC,
- [UniqueValue] ASC
- END
- /*
- Select the first @pageSize records that come after the last sort
- data/unique value from the last page. If this is the first page,
- just get the first @pageSize records.
- */
- SET ROWCOUNT @pageSize
- SELECT
- [SalesOrderID],
- [OrderDate],
- [TotalDue],
- [CustomerID]
- FROM
- (
- SELECT
- [SalesOrderID],
- [OrderDate],
- [TotalDue],
- [CustomerID],
- [SalesOrderID] As [UniqueValue],
- CASE
- WHEN
- UPPER(@sortOrder) = 'DESC'
- AND UPPER(@sortExpression) = 'CUSTOMERID'
- THEN
- CONVERT(SQL_Variant, [CustomerID])
- WHEN
- UPPER(@sortOrder) = 'DESC'
- AND UPPER(@sortExpression) = 'TOTALDUE'
- THEN
- CONVERT(SQL_Variant, [TotalDue])
- WHEN
- UPPER(@sortOrder) = 'DESC'
- AND UPPER(@sortExpression) = 'ORDERDATE'
- THEN
- CONVERT(SQL_Variant, [OrderDate])
- ELSE
- NULL
- END AS [DescendingSort],
- CASE
- WHEN
- UPPER(@sortOrder) = 'ASC'
- AND UPPER(@sortExpression) = 'CUSTOMERID'
- THEN
- CONVERT(SQL_Variant, [CustomerID])
- WHEN
- UPPER(@sortOrder) = 'ASC'
- AND UPPER(@sortExpression) = 'TOTALDUE'
- THEN
- CONVERT(SQL_Variant, [TotalDue])
- WHEN
- UPPER(@sortOrder) = 'ASC'
- AND UPPER(@sortExpression) = 'ORDERDATE'
- THEN
- CONVERT(SQL_Variant, [OrderDate])
- ELSE
- NULL
- END AS [AscendingSort]
- FROM
- Sales.SalesOrderHeader Header
- WHERE
- Header.[OrderDate] >= @orderedOnStart
- AND Header.[OrderDate] < @orderedOnEnd
- ) Derived
- WHERE
- (
- @lastAscendingSortValue IS NULL
- AND @lastDescendingSortValue IS NULL
- AND @lastKeyValue IS NULL
- )
- OR
- (
- (@lastAscendingSortValue IS NOT NULL)
- AND
- (
- ([AscendingSort] > @lastAscendingSortValue)
- OR
- (
- [AscendingSort] = @lastAscendingSortValue
- AND [UniqueValue] > @lastKeyValue
- )
- )
- )
- OR
- (
- (@lastDescendingSortValue IS NOT NULL)
- AND
- (
- ([DescendingSort] < @lastDescendingSortValue)
- OR
- (
- [DescendingSort] = @lastDescendingSortValue
- AND [UniqueValue] > @lastKeyValue
- )
- )
- )
- ORDER BY
- [AscendingSort] ASC,
- [DescendingSort] DESC,
- [SalesOrderID] ASC
- SET ROWCOUNT 0
- GO
複製代碼 |
|