码迷,mamicode.com
首页 > 数据库 > 详细

SQL 高效的万能分页语句

时间:2018-05-20 00:47:36      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:har   aging   sts   put   _id   删除   关键字   proc   varchar   

代码如下:

USE [Blog]
IF OBJECT_ID(Proc_Paging, P) IS NOT NULL    --删除同名存储过程
    DROP PROC Proc_Paging
GO
CREATE PROC Proc_Paging
    @TableFields NVARCHAR(512),
    @TableName NVARCHAR(512),
    @SqlWhere NVARCHAR(512),
    @OrderBy NVARCHAR(64),
    @PageIndex INT,
    @PageSize INT,
    @TotalCount INT OUTPUT
AS
    DECLARE @SQL1 NVARCHAR(2048), @SQL2 NVARCHAR(2048)    --@SQL1和@SQL2最好设置为比较长的字符串,否则会因为SQL语句过长而导致执行失败
    --SET @SQL1 = N‘SELECT TOP ‘ + CONVERT(VARCHAR(2), @PageSize) + ‘ * FROM (SELECT ROW_NUMBER() OVER(ORDER BY ‘ + @OrderBy + ‘) AS NID, ‘ + @TableFields + ‘ FROM ‘ + @TableName + ‘ WHERE ‘ + @SqlWhere + ‘) AS TmpTable WHERE TmpTable.NID > (@PageIndex - 1) * @PageSize‘  --用TOP关键字进行筛选
    SET @SQL1 = NSELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY  + @OrderBy + ) AS NID,  + @TableFields +  FROM  + @TableName +  WHERE  + @SqlWhere + ) AS TmpTable WHERE TmpTable.NID BETWEEN (@PageIndex - 1) * @PageSize + 1 AND @PageIndex* @PageSize
    SET @SQL2 = N@TableFields NVARCHAR(512),@TableName NVARCHAR(512),@SqlWhere NVARCHAR(512),@OrderBy NVARCHAR(64),@PageIndex INT,@PageSize INT,@TotalCount INT OUTPUT
EXEC SP_EXECUTESQL @SQL1, @SQL2, @TableFields, @TableName, @SqlWhere,@OrderBy,@PageIndex,@PageSize,@TotalCount OUTPUT
PRINT @SQL1    --打印执行语句  

GO    --测试用例
DECLARE @Count INT = 0
EXEC Proc_Paging *, POSTS, PublishTime < GETDATE(), Id, 5, 10, @Count OUTPUT    --筛选发布时间小于当前时间的记录

【注意点】:@SQL1和@SQL2最好设置为比较长的字符串,否则会因为SQL语句过长而导致执行失败

SQL 高效的万能分页语句

标签:har   aging   sts   put   _id   删除   关键字   proc   varchar   

原文地址:https://www.cnblogs.com/feiyuhuo/p/9062203.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!