3.思路二
上面的思路似乎行不通,那不如再换个思路,干脆不要建立临时表,用Select * from (select * from table) as temptable 这种思路代替创建临时表。
代码如下:
- ALTER PROCEDURE [dbo].[sp_Sql_Paging]
- (
- @SqlDataTable NVARCHAR(4000), -- 表名
- @PrimaryKey NVARCHAR(4000), -- 主键名称
- @Fields NVARCHAR(4000), -- 要返回的字段
- @pageSize INT, -- 页尺寸
- @pageIndex INT, -- 页码
- @recordCount INT OUTPUT, -- 记录总数
- @strOrderBy NVARCHAR(4000), -- 排序
- @strWhere NVARCHAR(4000) -- 查询条件
- )
- AS
- BEGIN
- SET NOCOUNT ON
- DECLARE @strSQL1 NVARCHAR(4000) -- SQL语句1
- DECLARE @strSQL2 NVARCHAR(4000) -- SQL语句2
- DECLARE @strSQL3 NVARCHAR(4000) -- SQL语句3
- SET @strSQL1 = 'SELECT ' + @PrimaryKey + ', ROW_NUMBER() OVER (' + @strOrderBy + ') AS RowNumber FROM ' + @SqlDataTable + ' ' + @strWhere
- --获取总记录数
- SET @strSQL3 = 'SELECT @recordCount = COUNT(*) FROM ' + @SqlDataTable + ' ' + @strWhere
- EXEC SP_EXECUTESQL
- @stmt = @strSQL3,
- @params = N'@recordCount AS INT OUTPUT',
- @recordCount = @recordCount OUTPUT
- --分页查询
- IF @pageIndex > @recordCount * 1.0 / @pageSize + 1.0 OR @recordCount <= @pageSize
- BEGIN
- SET @pageIndex = 1
- END
- SET @strSQL2 = 'SELECT ' + @Fields + ' FROM ' + @SqlDataTable + ' WHERE ' + @PrimaryKey + ' IN (SELECT '+@PrimaryKey+' FROM ('+@strSQL1+') TempTable WHERE RowNumber BETWEEN ' + Str((@pageIndex - 1) * @pageSize + 1) + ' AND ' + Str(@pageIndex * @pageSize) + ') ' + @strOrderBy
- EXEC SP_EXECUTESQL @strSQL2
- END
这里有个小知识点,注意EXEC SP_EXECUTESQL的写法以及和EXEC(@strsql)的区别。大家可以去找资料了解下。
关于分页的一些事就写到这了,仅供参考。
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。