SQL 千万级存储过程

CREATE   PROCEDURE SP_AnsonPagination
/*
***************************************************************
**  中国无忧商务网千万数量级分页存储过程                     **
***************************************************************
参数说明:
1.Tables             :表名称,视图
2.PrimaryKey         :主关键字
3.Sort               :排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc
4.CurrentPage        :当前页码
5.PageSize           :分页尺寸
6.Filter             :过滤语句,不带Where 
7.Group                 :Group语句,不带Group By

PrimaryKey="PrimaryKeyA"  
  Sort="PrimaryKeyB   "  

PrimaryKey和Sort都是用同一个主键的话,效率是最好的,推荐是用这种形式,比如:  
  PageSize   =   ConfigSettings.PageSize_Product  
  Tables   =   "Product_All_Info"   '要查询的表名或者是视图  
  Fields   =   "ProductID,ProductName"   '字段列表  
  PrimaryKey   =   "ProductID"  
  Filter   =   Sql  
  Sort="ProductID   desc"  
   
  很多时候还有按照最后更新时间来排序,可以定义Sort为  
  Sort="IssueTime   Desc"  
  当然这里IssueTime一定要做索引或者是主键   

版权所有:中国无忧商务网(http://www.cn5135.com)
欢迎试用,有什么心得请 Mail:xzhijun@GMail.com
示例代码:http://www.cn5135.com/_App/Enterprise/QueryResult.aspx
**************************************************************
*/
(
@Tables nvarchar(1000),
@PrimaryKey nvarchar(100),
@Sort nvarchar(200= NULL,
@CurrentPage int = 1,
@PageSize int = 10,
@Fields nvarchar(1000= N'*',
@Filter nvarchar(1000= NULL,
@Group nvarchar(1000= NULL
)
AS

/*默认排序*/
IF @Sort IS NULL OR @Sort = ''
    
SET @Sort = @PrimaryKey

DECLARE @SortTable nvarchar(100)
DECLARE @SortName nvarchar(100)
DECLARE @strSortColumn nvarchar(200)
DECLARE @operator char(2)
DECLARE @type nvarchar(100)
DECLARE @prec int

/*设定排序语句.*/    
IF CHARINDEX('DESC',@Sort)>0
    
BEGIN
        
SET @strSortColumn = REPLACE(@Sort'DESC''')
        
SET @operator = '<='
    
END
ELSE
    
BEGIN
        
IF CHARINDEX('ASC'@Sort= 0
            
SET @strSortColumn = REPLACE(@Sort'ASC''')
        
SET @operator = '>='
    
END


IF CHARINDEX('.'@strSortColumn> 0
    
BEGIN
        
SET @SortTable = SUBSTRING(@strSortColumn0CHARINDEX('.',@strSortColumn))
        
SET @SortName = SUBSTRING(@strSortColumnCHARINDEX('.',@strSortColumn+ 1LEN(@strSortColumn))
    
END
ELSE
    
BEGIN
        
SET @SortTable = @Tables
        
SET @SortName = @strSortColumn
    
END

SELECT @type=t.name, @prec=c.prec
FROM sysobjects o 
JOIN syscolumns c on o.id=c.id
JOIN systypes t on c.xusertype=t.xusertype
WHERE o.name = @SortTable AND c.name = @SortName

IF CHARINDEX('char'@type> 0
   
SET @type = @type + '(' + CAST(@prec AS varchar+ ')'

DECLARE @strPageSize nvarchar(50)
DECLARE @strStartRow nvarchar(50)
DECLARE @strFilter nvarchar(1000)
DECLARE @strSimpleFilter nvarchar(1000)
DECLARE @strGroup nvarchar(1000)

/*默认当前页*/
IF @CurrentPage < 1
    
SET @CurrentPage = 1

/*设置分页参数.*/
SET @strPageSize = CAST(@PageSize AS nvarchar(50))
SET @strStartRow = CAST(((@CurrentPage - 1)*@PageSize + 1AS nvarchar(50))

/*筛选以及分组语句.*/
IF @Filter IS NOT NULL AND @Filter != ''
    
BEGIN
        
SET @strFilter = ' WHERE ' + @Filter + ' '
        
SET @strSimpleFilter = ' AND ' + @Filter + ' '
    
END
ELSE
    
BEGIN
        
SET @strSimpleFilter = ''
        
SET @strFilter = ''
    
END
IF @Group IS NOT NULL AND @Group != ''
    
SET @strGroup = ' GROUP BY ' + @Group + ' '
ELSE
    
SET @strGroup = ''
    
/*执行查询语句*/    
EXEC(
'
DECLARE @SortColumn 
' + @type + '
SET ROWCOUNT 
' + @strStartRow + '
SELECT @SortColumn=
' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
SET ROWCOUNT 
' + @strPageSize + '
SELECT 
' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
'
)
GO
posted @ 2007-08-21 23:22 Anson2020 阅读(503) 评论(6)  编辑 收藏 所属分类: SQL Server

  回复  引用    
#1楼 2007-08-22 01:41 | Dicky [未注册用户]
有测试数据吗
  回复  引用    
#2楼 2007-08-22 08:52 | 幻想曲 [未注册用户]
无法返回记录总数?
  回复  引用  查看    
#3楼 2007-08-22 09:50 | 没剑      
网上大把的1000W级存储过程,而我们想看到的是事实和测试数字。。。
一堆的代码唬不了偶们~
  回复  引用    
#4楼 2008-01-29 12:12 | zyvslxl [未注册用户]
到了 百W级别 以上 数据库结构 就比较重要了
  回复  引用  查看    
#5楼 2008-02-14 16:37 | Tony Zhou      
SET ROWCOUNT是也
  回复  引用    
#6楼 2008-03-18 07:44 | wuya2 [未注册用户]
您的存储过程有BUG,
例如:
(1)@Sort参数不能包含ASC关键字;
(2)@Sort参数不能有多个字段。

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  博客园首页

  新闻频道

  社区

  小组

  博问

  网摘

  闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
成果网帮您增加网站收入


相关链接: