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  阅读(1161)  评论(6)    收藏  举报