CREATE PROC Xpage
--Author:萧栎.Exe
--Date:2004七夕
--Ver:1.1
@Columns varchar(200), --需要查询的列
@TableValue varchar(200), --需要查询的表和条件
@OrderKey varchar(20), --排序字段
@IdentKey varchar(30)='ID', --唯一标识字段
@PageSize smallint, --每页的行数
@PageNumber smallint, --要显示的页码, 从1开始
@Order varchar(4)='DESC', --排序方式 DESC/ASC
@Result int output --输出总记录数
AS
SET NOCOUNT ON
BEGIN
DECLARE @MainSql AS varchar(1000)
DECLARE @VirtualTable AS varchar(1000)
DECLARE @Countable AS nvarchar(1000)
DECLARE @Alls AS int
SET @Countable = 'SELECT @ALL = COUNT(' + @IdentKey + ')' + ' FROM ' + @TableValue
EXEC sp_executesql @Countable,N'@All int output',@Alls output
SET @Result=@Alls
SET @VirtualTable = 'SELECT TOP ' + CAST((@PageNumber) * @pageSize AS varchar(30)) + ' ' + @Columns +
' FROM '+ @TableValue + ' ORDER BY '+@OrderKey +' '+ @Order
SET @MainSql ='SELECT TOP ' + CAST(@PageSize AS varchar(30)) + ' * ' +
'FROM (' + @VirtualTable + ') AS tableA ' +
'WHERE ' + @IdentKey + ' NOT IN(SELECT TOP ' +
CAST((@PageNumber-1) * @PageSize AS varchar(30)) + ' ' + @IdentKey +
' FROM (' + @VirtualTable + ') AS tableB)'
EXEC (@MainSql)
END
GO
翻页存储过程的第二版:
+总数的输出参数
+排序自定义
被那个 sp_executesql 搞了好久,后来发现是少个空格的原因,日。。
这个应该算比较方便的一个翻页存储过程了,数据量百万左右ID为主键的翻页速度在两秒以内,再多的数据估计就会慢下来了。在轻量级数据量下这个算是最快,最少资源占用的方式。
主要耗费时间的地方:sp_executesql,TOP上的乘法运算,IN操作。如果order by的字段索引没设计好的话,速度就会被拖得更慢。
(七夕,泣兮……)