SQL 萬能分頁存儲過程

USE [TestDB]
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 SELECT @TotalCount = COUNT(1) FROM ' + @TableName + ' WHERE ' + @SqlWhere  --用TOP關鍵字進行篩選
    SET @SQL1 = N'SELECT * 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 SELECT @TotalCount = COUNT(1) FROM ' + @TableName + ' WHERE ' + @SqlWhere
    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 '*', 'TestTable', '1=1', 'Id', 5, 10, @Count OUTPUT    --篩選發佈時間小於當前時間的記錄

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章