利用 row_number 进展对传入SQL语句进行分页
利用 row_number 进行对传入SQL语句进行分页
注意:
1. 传入的sql语句, 必须带order by
2. 以前见过带Group by 的sql , 直接用有问题, 修改后还是可以用, 但一时记不清情形了, 哪位看官有兴趣请指出, 大家共同切磋!
-- 创建测试表 CREATE TABLE TestTable ( [Id] UNIQUEIDENTIFIER PRIMARY KEY, [Name] VARCHAR(30) ) GO -- 加上9条测试数据 DELETE FROM TestTable DECLARE @rowIdx INT SET @rowIdx = 1 WHILE (@rowIdx <= 9) BEGIN INSERT INTO TestTable ( Id, [NAME] ) VALUES ( NEWID(), '名字' + CONVERT(VARCHAR(2), @rowIdx) ) SET @rowIdx = @rowIdx + 1 END
ALTER PROC PaginationForSQL @sql VARCHAR(MAX), @pageIndex INT, @pageSize INT AS BEGIN DECLARE @newSql VARCHAR(MAX) DECLARE @orderBy VARCHAR(100) DECLARE @orderByIndex INT --取得最后一个order by 的位置 SET @orderByIndex = 0 DECLARE @tempindex INT WHILE (1 = 1) BEGIN SET @tempindex = CHARINDEX('order', @sql, @orderByIndex + 1) IF (@tempindex = 0) BREAK SET @orderByIndex = @tempindex END SET @orderBy = SUBSTRING(@sql, @orderByIndex, LEN(@sql) -@orderByIndex + 1) SET @sql = SUBSTRING(@sql, 0, LEN(@sql) -LEN(@orderBy)) --得到总记录数 SET @newSql = 'SELECT count(1) as Total FROM (' + @sql + ') AS t_outer ' PRINT @newSql EXEC (@newSql) --得到查询结果 SET @newSql = 'SELECT * FROM ( SELECT ROW_NUMBER() OVER(' + @orderBy + ') AS RowNum,* FROM (' + @sql + ') AS t_inner ) AS t_outer WHERE RowNum > ' + CONVERT(VARCHAR(10), (@pageIndex -1) * @pageSize) + ' AND RowNum <= ' + CONVERT(VARCHAR(10), @pageIndex * @pageSize) PRINT @newSql EXEC (@newSql) END GO EXEC dbo.PaginationForSQL 'select * from TestTable order by name',2,4