Colorful Life2010

可以依据任何字段进行排序并分页的存储过程(z)
Weather:阴 ,南风 4-5级 ,最高气温1 ℃

之前用过的一些存储过程分页
大多数都只能根据主键排序,可是实际上,我们经常需要依据非主键排序并分页,比如,按工资大小
下面的代码能完成工作

ALTER PROCEDURE dbo.GetPageRecord
    (
    @tblName      
varchar(255),       -- 表名
    @fldName      varchar(255),       --排序字段
    @KeyField     varchar(255),        --主键
    @PageSize     int = 10,           -- 页尺寸
    @PageIndex    int = 1,            -- 页码
    @IsCount      bit = 0,            -- 返回记录总数, 非 0 值则返回
    @OrderType    bit = 1,            -- 设置排序类型, 非 0 值则降序
    @strWhere     varchar(4000= ''  -- 查询条件 (注意: 不要加 where)
    )
AS
SET NOCOUNT ON
DECLARE @PageLowerBound int
DECLARE @PageUpperBound int

-- Set the page bounds
SET @PageLowerBound = @PageSize * @PageIndex
SET @PageUpperBound = @PageLowerBound + @PageSize + 1

-- Create a temp table to store the select results
CREATE TABLE #tmp
(
     RecNo 
int IDENTITY (11NOT NULL,
     oldid 
int
)
--generate record
Declare @Sqlstr varchar(6000)
set @sqlstr='select '+@Keyfield+' from '+@tblname
if(@strWhere<>'')
begin
    
set @Sqlstr=@sqlstr+' where ('+@strWhere+')'
end
set @sqlstr=@sqlstr+' order by '+@fldName
if(@ordertype=0)
begin
    
set @sqlstr=@sqlstr+' asc'
end
else
begin
    
set @sqlstr=@sqlstr+' desc'
end
set @sqlstr='insert into #tmp (oldid) '+@sqlstr
execute(@sqlstr)
set @sqlstr='SELECT TableA.* FROM '+@tblname+' TableA (nolock), #tmp T WHERE T.oldid = TableA.'+@keyfield+' AND T.RecNo > '+ cast(@PageLowerBound as varchar)+' AND  T.RecNo < '+cast(@PageUpperBound as varchar)+' ORDER BY T.RecNo'
execute(@sqlstr)
原文地址:http://heroman.cnblogs.com/archive/2004/12/08/74333.html
历史上的今天: [2010/02/28]HI~我今天要表演变章鱼!
[2007/02/28]搬家

[可以依据任何字段进行排序并分页的存储过程(z)]的回复

某些人 于 2006-03-01 11:03:51 发表 | IP:210.22.166.*
不错不错。测试private String
柠檬园主 于 2006-03-02 10:25:51 发表 | IP:59.44.76.*
差点没让那些老外恶心死,天天来发垃圾回复,呵呵,这下好了
forestagn 于 2006-03-02 12:38:05 发表 | IP:220.114.249.*

这个文章我也看不懂啊

借此祝贺3rgb首页获的pr值为5,不错啊.

4#   柠檬园主 于 2006-03-02 13:03:17 发表 | IP:59.44.76.*

多谢老大哥捧场,哈哈哈,偶也是今天刚发现变成PR5了,前两天偶而出现过5,但刷一刷就变成4了,今天刷了好几下都没变。哈哈,看来是成功升值啦

5#   秦歌 于 2006-03-04 01:06:36 发表 | IP:61.51.148.*
http://www.google.com/search?hl=zh-TW&q=%E6%AA%B8%E6%AA%AC%E7%9A%84%E6%A8%A3%E5%AD%90&btnG=Google%20%E6%90%9C%E5%B0%8B&lr=
6#   柠檬园主 于 2006-03-06 22:52:45 发表 | IP:218.61.195.*
晕死,干什么呐~~
7#   joe 于 2006-03-07 21:07:02 发表 | IP:218.80.141.*
对没有索引的字段进行排序速度不容乐观。
8#   柠檬园主 于 2006-03-07 21:58:25 发表 | IP:221.201.156.*
终于有个以文对题的了,不索引乱排序肯定是不行的了,作者其实主要是实现了可以自定字段,具体使用就得看DBA的了,一个表的搜索条件要多样化的话,就得多建几个索引,我在一个表中就建了4年索引,而主键我用的GUID,虽然默认索引了,但实际上这个索引没用得上。
9#   joe 于 2006-03-08 22:51:58 发表 | IP:218.80.141.*
如果一个表更新较频繁,且索引过多,很容易造成死锁。
10#   柠檬园主 于 2006-03-09 09:12:38 发表 | IP:210.83.202.*
问题是,如果不经常更新,除了像IP地址库这样的东西外,也没到数据要多到用索引啊。矛盾了不是?呵呵
11#   joe 于 2006-03-11 16:13:26 发表 | IP:218.80.141.*
因此数据库设计也是一门艺术。
Post a Comment~