[SQL] SQL Server 2005高效分页存储过程 →→→→→进入此内容的聊天室

来自 , 2020-09-27, 写在 SQL, 查看 107 次.
URL http://www.code666.cn/view/176bf621
  1. IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[proc_DataPagingList]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  2. DROP PROCEDURE [dbo].[proc_DataPagingList]
  3. GO
  4.  
  5. CREATE PROCEDURE [dbo].[proc_DataPagingList]
  6. (
  7. @tableName NVARCHAR(200),      ----要显示的表或多个表的连接
  8. @fieldNames NVARCHAR(200)='*', ----要显示的字段列表
  9. @pageSize INT = 10,            ----每页显示的记录个数
  10. @page INT = 10,                ----要显示那一页的记录
  11. @pageCount INT = 1 output,     ----查询结果分页后的总页数
  12. @counts INT = 1 output,        ----查询到的总记录数
  13. @fieldSort NVARCHAR(200)= NULL,----排序字段列表或条件
  14. @sort BIT = 1,                 ----排序方法,0为升序,1为降序--程序传参如:' SortA Asc,SortB Desc,SortC ')
  15. @condition NVARCHAR(200)= NULL,----查询条件,不需WHERE
  16. @keyID NVARCHAR(100),          ----主表的主键
  17. @DISTINCT BIT = 0              ----是否添加查询字段的 DISTINCT 默认0不添加/1添加
  18. )
  19. AS
  20.  
  21. SET NOCOUNT ON
  22. DECLARE @SELECT NVARCHAR(1000)    ----存放动态生成的SQL语句
  23. DECLARE @strCounts NVARCHAR(1000) ----存放取得查询结果总数的查询语句
  24. DECLARE @strID  NVARCHAR(1000)    ----存放取得查询开头或结尾ID的查询语句
  25.  
  26. DECLARE @sortTypeA NVARCHAR(10)   ----数据排序规则A
  27. DECLARE @SortTypeB NVARCHAR(10)   ----数据排序规则B
  28.  
  29. DECLARE @distSelect NVARCHAR(50)  ----对含有DISTINCT的查询进行SQL构造
  30. DECLARE @distCounts NVARCHAR(50)  ----对含有DISTINCT的总数查询进行SQL构造
  31.  
  32. DECLARE @SortfieldA NVARCHAR(50)  ----对含有是否还有排序字段时的排序方式组合A
  33. DECLARE @SortfieldB NVARCHAR(50)  ----对含有是否还有排序字段时的排序方式组合B
  34.  
  35.  
  36. IF @DISTINCT = 0
  37.         BEGIN
  38.                 SET @distSelect = 'SELECT '
  39.                 SET @distCounts = ' COUNT(*)'
  40.         END
  41. ELSE
  42.         BEGIN
  43.                 SET @distSelect = 'SELECT distinct '
  44.                 SET @distCounts = ' COUNT(DISTINCT '+@keyID+')'
  45.         END
  46.  
  47. IF @sort=0
  48.         BEGIN
  49.                 SET @SortTypeB=' ASC '
  50.                 SET @sortTypeA=' DESC '
  51.         END
  52. ELSE
  53.         BEGIN
  54.                 SET @SortTypeB=' DESC '
  55.                 SET @sortTypeA=' ASC '
  56.         END
  57.  
  58. IF @fieldSort IS NOT NULL AND @fieldSort<>'' --排序字段不为空时
  59.         BEGIN
  60.                 SET @SortfieldB=' order by '+ @fieldSort +' '+ @SortTypeB
  61.                 SET @SortfieldA=' order by '+ @fieldSort +' '+ @SortTypeA
  62.         END
  63. ELSE
  64.         BEGIN
  65.                 SET @SortfieldB=''
  66.                 SET @SortfieldA=''
  67.         END
  68.  
  69. --------生成查询语句--------
  70. --此处@strCounts为取得查询结果数量的语句
  71. IF @condition IS NULL OR @condition=''     --没有设置显示条件
  72.         BEGIN
  73.                 SET @SELECT =  @fieldNames + ' FROM ' + @tableName
  74.                 SET @strCounts = @distSelect+' @counts='+@distCounts+' FROM '+@tableName
  75.                 SET @strID = ' FROM ' + @tableName
  76.         END
  77. ELSE
  78.         BEGIN
  79.                 SET @SELECT = + @fieldNames + 'FROM ' + @tableName + ' WHERE  ' + @condition
  80.                 SET @strCounts = @distSelect+' @counts='+@distCounts+' FROM '+@tableName + ' WHERE ' + @condition
  81.                 SET @strID = ' FROM ' + @tableName + ' WHERE  ' + @condition
  82.         END
  83.  
  84. ----取得查询结果总数量-----
  85. EXEC sp_executesql @strCounts,N'@counts INT out ',@counts OUT
  86. DECLARE @tmpCounts INT
  87.  
  88. IF @counts = 0
  89.     SET @tmpCounts = 1
  90. ELSE
  91.     SET @tmpCounts = @counts
  92.  
  93.     --取得分页总数
  94.     SET @pageCount=(@tmpCounts+@pageSize-1)/@pageSize
  95.  
  96.     --/**当前页大于总页数 取最后一页**/
  97.     IF @page>@pageCount
  98.         SET @page=@pageCount
  99.  
  100.     --/*-----数据分页2分处理-------*/
  101.     DECLARE @pageIndex INT --总数/页大小
  102.     DECLARE @lastcount INT --总数%页大小
  103.  
  104.     SET @pageIndex = @tmpCounts/@pageSize
  105.     SET @lastcount = @tmpCounts%@pageSize
  106.     IF @lastcount > 0
  107.         SET @pageIndex = @pageIndex + 1
  108.     ELSE
  109.         SET @lastcount = @pageSize
  110.  
  111.     --显示分页
  112.     IF @condition IS NULL OR @condition=''     --没有设置显示条件
  113.     BEGIN
  114.         IF @pageIndex<2 OR @page<=@pageIndex / 2 + @pageIndex % 2   --前半部分数据处理
  115.             BEGIN
  116.                 SET @strCounts=@distSelect+' TOP '+ CAST(@pageSize AS VARCHAR(4))+' '+ @fieldNames+' FROM '+@tableName + ' WHERE '+@keyID+' not in('+ @distSelect+' TOP '+ CAST(@pageSize*(@page-1) AS VARCHAR(20)) +' '+ @keyID +' FROM '+@tableName + @SortfieldB +')' + @SortfieldB
  117.             END
  118.         ELSE
  119.             BEGIN
  120.             SET @page = @pageIndex-@page+1 --后半部分数据处理
  121.                 IF @page <= 1 --最后一页数据显示
  122.                     SET @strCounts=@distSelect+' * FROM ('+@distSelect+' TOP '+ CAST(@lastcount AS VARCHAR(4))+' '+ @fieldNames+' FROM '+@tableName + @SortfieldA+') AS TempTB '+@SortfieldB
  123.                 ELSE                
  124.                     SET @strCounts=@distSelect+' * FROM ('+@distSelect+' TOP '+ CAST(@pageSize AS VARCHAR(4))+' '+ @fieldNames+' FROM '+@tableName + ' WHERE '+@keyID+' not in('+ @distSelect+' TOP '+ CAST(@pageSize*(@page-2)+@lastcount AS VARCHAR(20)) +' '+ @keyID +' FROM '+@tableName + @SortfieldA+')' + @SortfieldA+') AS TempTB '+@SortfieldB
  125.             END
  126.     END
  127.  
  128.     ELSE --有查询条件
  129.     BEGIN
  130.         IF @pageIndex<2 OR @page<=@pageIndex / 2 + @pageIndex % 2   --前半部分数据处理
  131.         BEGIN
  132.                 SET @strCounts=@distSelect+' TOP '+ CAST(@pageSize AS VARCHAR(4))+' '+ @fieldNames +' FROM  '+@tableName + ' WHERE '+@keyID+' not in('+ @distSelect+' TOP '+ CAST(@pageSize*(@page-1) AS VARCHAR(20)) +' '+ @keyID +' FROM '+@tableName + ' Where ' + @condition + @SortfieldB+')'+' AND ' + @condition + @SortfieldB                
  133.         END
  134.         ELSE
  135.         BEGIN
  136.             SET @page = @pageIndex-@page+1 --后半部分数据处理
  137.             IF @page <= 1 --最后一页数据显示
  138.                     SET @strCounts=@distSelect+' * FROM ('+@distSelect+' TOP '+ CAST(@lastcount AS VARCHAR(4))+' '+ @fieldNames+' FROM '+@tableName + ' WHERE  '+ @condition +@SortfieldA+') AS TempTB '+@SortfieldB
  139.             ELSE
  140.                     SET @strCounts=@distSelect+' * FROM ('+@distSelect+' TOP '+ CAST(@pageSize AS VARCHAR(4))+' '+ @fieldNames+' FROM '+@tableName + ' WHERE '+@keyID+' not in('+ @distSelect+' TOP '+ CAST(@pageSize*(@page-2)+@lastcount AS VARCHAR(20)) +' ' + @keyID +' FROM '+@tableName +' WHERE  '+ @condition +@SortfieldA+')' +' AND '+ @condition +@SortfieldA+') AS TempTB ' + @SortfieldB
  141.         END    
  142.     END
  143.  
  144. ------返回查询结果-----
  145. EXEC sp_executesql @strCounts
  146. SET NOCOUNT OFF
  147. //SQL/1226

回复 "SQL Server 2005高效分页存储过程"

这儿你可以回复上面这条便签

captcha