日期:2014-05-17  浏览次数:20482 次

求写一个关于分页的sql语句
本来是想这样写的,可是写了好久一直写不下去,求助
SQL code

and('+@numtime+'<(select min('+@numtime+') from(select top '+str((@currentpage-1)*@pagesize)+''+@numtime+',moduleid from Modules)as tab)
or '+@numtime+'=(select min('+@numtime+') from(select top '+str((@currentpage-1)*@pagesize)+''+@numtime+',moduleid from Modules)as tab2)
          and moduleid<这里写不下去了 )


就是想实现where numtime>取出来的numtime or (numtime=取出来的numtime and 主键moduleid>取出来的主键值)。
网上的分页都是以主键进行的不能有重复值,我numtime是有重复的,想以这个作为排序字段。

------解决方案--------------------

USE tempdb
go

IF OBJECT_ID('tempdb..#tb') IS NOT NULL
DROP TABLE #tb 
CREATE TABLE #tb(id INT)

INSERT INTO #tb
SELECT 1
UNION
SELECT 2
UNION
SELECT 3
UNION
SELECT 4
UNION
SELECT 5
UNION
SELECT 6
UNION
SELECT 7

DECLARE @PageIndex int
DECLARE @PageNumber int
DECLARE @AscendingField varchar(50)
SET @PageIndex=2 --选择页码
SET @PageNumber=2 --每页出现的记录数
SET @AscendingField = 'id' --结果集中的排序字段

--@exec字符串为分页过程主要逻辑,可从网上copy下来后改写
DECLARE @exec NVARCHAR(500)
SET @exec=
N'
;WITH c1 AS
(
SELECT ROW_NUMBER() OVER(ORDER BY @AscendingField) row_numberId, id
FROM #tb
)
SELECT id
FROM c1
WHERE row_numberid>(@PageIndex-1)*@PageNumber 
and row_numberid<@PageIndex*@PageNumber+1'

SET @exec = REPLACE(@exec, '@AscendingField', @AscendingField)
SET @exec = REPLACE(@exec, '@PageIndex', @PageIndex)
SET @exec = REPLACE(@exec, '@PageNumber', @PageNumber)

EXEC SP_EXECUTESQL @exec

---试试看这个能不能满足你的要求!

写了一个例子,具体的代码你还需要进行修改,如果是SQL2000需要把ROW_Number换成IDENTITY(1,1)进行自增。