SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author:大師兄 -- Create date: 2018-07-16 -- Description:分頁數據查詢通用存儲過程,單表 -- ============================================= GO CREATE PROCEDURE [dbo].[PROC_PAGINATIONBY_SINGLE_TABLE] @FEILDS VARCHAR(1000),--要顯示的數據字段,*表示全部字段 @TABLE_NAME VARCHAR(100),--要查詢的數據表名稱 @PAGE_INDEX INT,--當前頁碼 @PAGE_SIZE INT,--頁面大小 @ORDERTYPE BIT,--當爲0時 則爲 desc 當爲1 時 asc @ANDWHERE VARCHAR(1000)='',--where語句 不用加where @ORDERFEILD VARCHAR(100) --排序的字段 as DECLARE @EXECSQL VARCHAR(2000) DECLARE @ORDERSTR VARCHAR(100) DECLARE @ORDERBY VARCHAR(100) BEGIN set NOCOUNT on IF @ORDERTYPE =1 BEGIN SET @ORDERSTR =' > ( SELECT MAX(['+@ORDERFEILD+'])' SET @ORDERBY ='ORDER BY '+@ORDERFEILD+' ASC' END ELSE BEGIN SET @ORDERSTR =' < ( SELECT MIN(['+@ORDERFEILD+'])' SET @ORDERBY ='ORDER BY '+@ORDERFEILD+' DESC' END IF @PAGE_INDEX =1--當頁碼是第一頁時直接運行,提升速度 BEGIN IF @ANDWHERE='' SET @EXECSQL ='SELECT TOP '+STR(@PAGE_SIZE)+''+@FEILDS+' FROM '+ @TABLE_NAME +' '+ @ORDERBY ELSE SET @EXECSQL ='SELECT TOP '+STR(@PAGE_SIZE)+''+@FEILDS+' FROM '+ @TABLE_NAME +' WHERE '+@ANDWHERE+''+ @ORDERBY END ELSE BEGIN IF @ANDWHERE='' BEGIN --以子查詢結果當作新表時 要給表名別名才能用 SET @EXECSQL ='SELECT TOP'+STR(@PAGE_SIZE)+''+@FEILDS+' FROM '+ @TABLE_NAME +' WHERE '+@ORDERFEILD+ @ORDERSTR+' FROM (SELECT TOP '+STR(@PAGE_SIZE*(@PAGE_INDEX-1))+''+@ORDERFEILD+ ' FROM '+ @TABLE_NAME +' '+@ORDERBY+') AS TEMP) '+ @ORDERBY END ELSE BEGIN SET @EXECSQL ='SELECT TOP'+STR(@PAGE_SIZE)+''+@FEILDS+' FROM '+ @TABLE_NAME +' WHERE '+@ORDERFEILD+ @ORDERSTR+' FROM (SELECT TOP '+ STR(@PAGE_SIZE*(@PAGE_INDEX-1))+''+@ORDERFEILD+ ' FROM '+ @TABLE_NAME +' WHERE '+@ANDWHERE+''+@ORDERBY+') AS TEMP) AND '+@ANDWHERE+''+ @ORDERBY END END EXEC (@EXECSQL)--這裏要加括號 END
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author:大師兄 -- Create date: 2018-07-16 -- Description:分頁數據查詢通用存儲過程,多表 -- ============================================= GO Create PROCEDURE [dbo].[PROC_PAGINATIONBY_MULTI_TABLE] ( @TableName VARCHAR(1000), --表名,多表是請使用 tableA a INNER JOIN tableB b ON a.AID = b.AID @PrimaryKey NVARCHAR(100), --主鍵,能夠帶表頭 a.AID @Fields NVARCHAR(2000) = '*',--讀取字段 @Condition NVARCHAR(3000) = '',--Where條件 @CurrentPage INT = 1, --開始頁碼 @PageSize INT = 10, --頁大小 @Sort NVARCHAR(200) = '',--排序字段a.AID desc,b.ID asc @RecordCount INT = 0 OUT ) AS DECLARE @strWhere VARCHAR(2000) DECLARE @strsql NVARCHAR(3900) IF @Condition IS NOT NULL AND len(ltrim(rtrim(@Condition)))>0 BEGIN SET @strWhere = ' WHERE ' + @Condition + ' ' END ELSE BEGIN SET @strWhere = '' END IF (charindex(ltrim(rtrim(@PrimaryKey)),@Sort)=0) BEGIN IF(@Sort='') SET @Sort = @PrimaryKey + ' DESC ' ELSE SET @Sort = @Sort+ ' , '+@PrimaryKey + ' DESC ' END SET @strsql = 'SELECT @RecordCount = Count(1) FROM ' + @TableName + @strWhere EXECUTE sp_executesql @strsql ,N'@RecordCount INT output',@RecordCount OUTPUT IF @CurrentPage = 1 --第一頁提升性能 BEGIN SET @strsql = 'SELECT TOP ' + str(@PageSize) +' '+@Fields+ ' FROM ' + @TableName + ' ' + @strWhere + ' ORDER BY '+ @Sort END ELSE BEGIN /* 執行動態查詢 */ DECLARE @START_ID NVARCHAR(50) DECLARE @END_ID NVARCHAR(50) SET @START_ID = CONVERT(NVARCHAR(50),(@CurrentPage - 1) * @PageSize + 1) SET @END_ID = CONVERT(NVARCHAR(50),@CurrentPage * @PageSize) SET @strsql = ' SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY '+@Sort+') AS rownum, '+@Fields+ 'FROM '+@TableName + @strWhere +') AS XX WHERE rownum BETWEEN '+@START_ID+' AND ' +@END_ID +' ORDER BY XX.rownum ASC' END EXEC(@strsql) RETURN