主要使用MSSQL的新函数ROW_Number实现,我是配合Ext.net使用的,记录下来,以备后用,如有不对,观迎指正。仅仅是实现了分页,效率没有考虑,我也是一MSSQL新手,所有代码就是GOOGLE组成的。获取count要SELECT一次,获取记录集又SELECT一次,实在不是个好办法,但我一直没找到解决方法,有知道的指导一下啊。
参数说明:
sql: 传进来的select语句,你可以任意构造,只要不反党就能用。
size: 一页的大小
start: 当前页的开始记录,我用的是ext.net,它直接给我的就是这参数,没有给pageindex,就不用去算了。
count: 输出参数,记录总数,这个是分页必须的吧,不然前台怎么知道要分多少页呢。
ALTER PROCEDURE [dbo].[SelectPage]
@sql nvarchar(2048),
@size int,
@start int,
@count int output
AS
BEGIN
declare @strPageA nvarchar(512);
declare @strPageB nvarchar(512);
declare @str nvarchar(3072);
SET @strPageA = 'SELECT * FROM (SELECT *,Row_Number() OVER (ORDER BY ID) AS RowNo FROM ( ';
SET @strPageB = ') AS T1) AS T2 WHERE RowNo BETWEEN ';
SET @count = 0;
--获取记录总数--
SET @str = 'SELECT @count=Count(*) FROM ( ' + @sql + ') AS TT';
EXEC sp_executesql @str, N'@count AS INT OUTPUT', @count OUTPUT;
--print @str;
--分页--
IF @start=0
SET @str = 'SELECT TOP '+str(@size) + ' * FROM (SELECT *,Row_Number() OVER (ORDER BY ID) AS RowNo FROM ( ' + @sql + ' ) AS T1 ) AS T2';
ELSE
SET @str = @strPageA + @sql + @strPageB + str(@start+1) + ' AND ' + str(@start+@size);
Exec( @str );
--print @str;
END