Tag: 分页预览模式: 普通 | 列表

MsSql 存储过程分页代码  

SQL代码
  1. MsSql 存储过程分页代码  
  2.   
  3.   
  4. --使用说明 本代码适用于MsSql2000,对于其它数据库也可用.但没必要  
  5. --创建存储过程  
  6. Create PROCEDURE pagination  
  7. @tblName varchar(255), -- 表名  
  8. @strGetFields varchar(1000) = '*'-- 需要返回的列  
  9. @fldName varchar(255)=''-- 排序的字段名(可包含如TABLE.FLDNAME形式)  
  10. @PageSize int = 10, -- 页尺寸  
  11. @PageIndex int = 1, -- 页码  
  12. @doCount bit = 0, -- 返回记录总数, 非 0 值则返回  
  13. @OrderType bit = 0, -- 设置排序类型, 非 0 值则降序  
  14. @strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)  
  15. AS  
  16. declare @strSQL varchar(5000) -- 主语句  
  17. declare @strTmp varchar(110) -- 临时变量  
  18. declare @strOrder varchar(400) -- 排序类型  
  19. declare @fldName_t varchar(255) -- 在分页时用的排序字段名,不包含多表并列时的表名  
  20. set @fldName_t = right(@fldName,len(@fldName)-CHARINDEX('.',@fldName))  
  21. if @doCount != 0  
  22. begin  
  23. if @strWhere !=''  
  24. set @strSQL = 'select count(*) as Total from ' + @tblName + ' where '+@strWhere  
  25. else  
  26. set @strSQL = 'select count(*) as Total from ' + @tblName + ''  
  27. end  
  28. -- 以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况  
  29. else  
  30. begin  
  31. if @OrderType != 0  
  32. begin  
  33. set @strTmp = '<(select min'  
  34. set @strOrder = ' order by ' + @fldName +' desc'  
  35. --如果@OrderType不是0,就执行降序,这句很重要!  
  36. end  
  37. else  
  38. begin  
  39. set @strTmp = '>(select max'  
  40. set @strOrder = ' order by ' + @fldName +' asc'  
  41. end  
  42. if @PageIndex = 1  
  43. begin  
  44. if @strWhere != ''  
  45. set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder  
  46. else  
  47. set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from '+ @tblName + ' '+ @strOrder  
  48. -- 如果是第一页就执行以上代码,这样会加快执行速度  
  49. end  
  50. else  
  51. begin  
  52. --以下代码赋予了@strSQL以真正执行的SQL代码  
  53. set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from '+ @tblName + ' where ' + @fldName + ' ' + @strTmp + ' ('+ @fldName_t + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '+ @fldName + ' from ' + @tblName + '' + @strOrder + ') as tblTmp)'+ @strOrder  
  54. if @strWhere != ''  
  55. set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from '+ @tblName + ' where ' + @fldName + ' ' + @strTmp + ' ('+ @fldName_t + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '+ @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' '+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder  
  56. end  
  57. end  
  58. exec (@strSQL)  
  59. go  
  60. --测试  
  61. create table news --建表  
  62. (  
  63. n_id int iDENTITY(1,1) primary key,  
  64. n_title char(200),  
  65. n_content text  
  66. )  
  67. --写循环插入1000000条的数据  
  68. create proc tt  
  69. as  
  70. declare @i int  
  71. set @i=0  
  72. while(@i<1000000)  
  73. begin  
  74. insert into news(n_title,n_content) values('sb','dsfsdfsd')  
  75. set @i=@i+1  
  76. end  
  77. exec tt  
  78. exec pagination 'news','*','n_id',1000,2,0,0,''   
  79.   
  80.   
  81. 自己改写的一个分页存储过程  
  82. Create PROC Paging  
  83. (  
  84. @pageSize int,  
  85. @pageIndex int,  
  86. @pageField nvarchar(32),  
  87. @countTotal bit=1,  
  88. @fieldQuery nvarchar(512),  
  89. @tableQuery nvarchar(512),  
  90. @whereQuery nvarchar(2048),  
  91. @orderQuery nvarchar(512)  
  92. )  
  93. AS  
  94. DECLARE @bdate Datetime  
  95. SET @bdate = getdate()  
  96. DECLARE @itemcount int  
  97. SET @itemcount=@pageIndex*@pageSize  
  98. DECLARE @itemlowwer int  
  99. SET @itemlowwer=(@pageIndex-1)*@pageSize  
  100. DECLARE @cmd nvarchar(3062)  
  101. IF @pageIndex=1  
  102. SET @cmd ='Select TOP ‘+CAST(@pageSize AS NVARCHAR)+' ‘+@fieldQuery+' FROM ‘+@tableQuery+' Where ‘+@whereQuery+' ORDER BY ‘+@orderQuery 
  103. ELSE 
  104. SET @cmd='Select ‘+@fieldQuery+' FROM ‘+@tableQuery+' Where ‘+@pageField+' IN (Select TOP ‘+CAST(@itemcount as nvarchar)+' ‘+@pageField+' FROM ‘+@tableQuery+' Where ‘+@whereQuery+' ORDER BY ‘+ @orderQuery+')  
  105. AND ‘+@pageField+' NOT IN (Select TOP ‘ +CAST(@itemlowwer as nvarchar)+' ‘+@pageField+' FROM ‘+@tableQuery+' Where ‘+@whereQuery+' ORDER BY ‘+ @orderQuery+')' 
  106. –print @cmd 
  107. EXEC(@cmd) 
  108. Select DATEDIFF( ms , @bdate , getdate() ) 
  109. IF @countTotal =1 
  110. BEGIN 
  111. SET @cmd = ‘Select COUNT( 0) FROM ‘+@tableQuery+' Where ‘+@whereQuery  
  112. EXEC(@cmd)  
  113. END  
  114. GO   

Tags: SQL 存储过程 分页

分类:MSSQL | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 41