6,129
社区成员
发帖
与我相关
我的任务
分享
看了逻辑,效率应该不高:
DECLARE @Temp table (tid INT identity(1,1) PRIMARY KEY, nid INT)
这个 PRIMARY KEY 仅仅是主键约束,而没有索引,因为表变量是不支持索引的。
在页数不多的情况下,或许比临时表快,测试100W数据,试试找第5万页以上的看看。
用临时表的方法也不及邹建的方法快。
邹建的方法也仍有优化的地方。
IF exists (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[pagingShow]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE [dbo].[pagingShow]
GO
CREATE PROC dbo.pagingShow
--表名.
@table VARCHAR(50),
--@table的主键.如Id
@id VARCHAR(50),
--页容量
@PageSize INT = 20,
--当前页
@PageIndex INT = 1,
--是否计算记录总条数,为1则计算,并返回总条数;为0则不返回,继续分页操作.
@DoCount BIT = 0,
--查询条件.
@where VARCHAR(255) = '',
--排序.
@order VARCHAR(255) = ''
AS
--组建SQL语句
DECLARE @strSQL varchar(5000) -- 主语句
DECLARE @strSQL1 varchar(5000) -- 主语句
SET NOCOUNT ON
IF @DoCount = 1
BEGIN
SET @strSQL = 'SELECT COUNT('+@id+') AS CT FROM ['+@table+']'
--带where条件查询
IF @where != ''
BEGIN
SET @strSQL = @strSQL + ' where '+@where
END
--计算总页数
EXEC(@strSQL)
END
---------------------------------------------分页-----------------------------------------------
ELSE BEGIN
DECLARE @PageLowerBound VARCHAR(50), @PageUpperBound VARCHAR(50)
SET @strSQL = 'DECLARE @Temp table (tid INT identity(1,1) PRIMARY KEY, nid INT)'
SET @PageLowerBound = CAST(((@PageIndex - 1) * @PageSize) AS VARCHAR)
SET @PageUpperBound = CAST((@PageLowerBound + @PageSize) AS VARCHAR)
-----------------------------------------
SET @strSQL = @strSQL + (' INSERT INTO @Temp(nid) SELECT top '+@PageUpperBound+' '+@id+' FROM ['+@table+']')
--带where条件查询
IF @where != ''
BEGIN
SET @strSQL = @strSQL + (' WHERE '+@where)
END
--order by 排序
IF @order != ''
BEGIN
SET @strSQL = @strSQL + ' ORDER BY '+@order
END
SET @strSQL = @strSQL + (' SELECT a.* FROM ['+@table+'] a,@Temp t WHERE (a.'+@id+' = t.nid) AND (t.tid > '+@PageLowerBound+') AND (t.tid <= '+@PageUpperBound+')')
EXEC(@strSQL)
END
SET NOCOUNT OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
exec('declare @Temp table (tid INT identity(1,1) PRIMARY KEY, nid VARCHAR(20))')