几米天空

--------我的几米天空

   :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

/*
 过程说明:对表按任意字段进行排序分页
 创建时间:2005年7月24日
 作者: chen gang
*/
CREATE PROCEDURE dbo.GetPagingRecord
    (
        @tablename varchar(100),--表名或视图表
        @fieldlist varchar(4000)='*',--欲选择字段列表
        @orderfield varchar(100),--排序字段
        @keyfield varchar(100),--主键
        @pageindex int,--页号,从1开始
        @pagesize int=20,--页尺寸
        @strwhere varchar(4000),--条件
        @ordertype varchar(1)='1'--排序,1,降序,0,升序
    )
AS

    SET NOCOUNT ON
    declare @sqlstr varchar(6000)
    declare @orderstr varchar(100)
    if(@keyfield=@orderfield)
    begin
 set @orderstr = ''
    end
    else
    begin
 set @orderstr = ','+@keyfield+' asc'
    end
    if @pageindex<=0
 set @pageindex=1
    --处理SQL中危险字符,并且将条件处理成易嵌入的形式
    set @strwhere=replace(@strwhere,'''','''''')
    set @strwhere=replace(@strwhere,'--','')
    set @strwhere=replace(@strwhere,';','')
    set @sqlstr='declare @CurPageNum int;'
    set @sqlstr=@sqlstr+'declare @nextpagenum int;'
    set @sqlstr=@sqlstr+'set @curpagenum='+cast(@PageIndex-1 as varchar)+'*'+cast(@Pagesize as varchar)+';'
    set @sqlstr=@sqlstr+'set @nextpagenum='+cast(@PageIndex as varchar)+'*'+cast(@Pagesize as varchar)+';'
    set @sqlstr=@sqlstr+'declare @sqlstr varchar(6000);'
    if @ordertype='1'
    begin
    set @sqlstr=@sqlstr+'set @sqlstr=''select '+@fieldlist+' from ( select top ''+cast(@nextpagenum as varchar)+'' * from 
 
'+@tablename+'  where 1=1 '+@strwhere+' order by '+@orderfield+' desc' + @orderstr+') as a where 1=1 and '+@keyfield+' not in ( 
 
select top ''+cast(@curpagenum as varchar)+'' '+@keyfield+' from '+@tablename+' where 1=1 '+@strwhere+' 
 
order by '+@orderfield +' desc'+ @orderstr +') order by ' + @orderfield +' desc'';'
    end
    else
    begin
    set @sqlstr=@sqlstr+'set @sqlstr=''select '+@fieldlist+' from ( select top ''+cast(@nextpagenum as varchar)+'' * from 
 
'+@tablename+'  where 1=1 '+@strwhere+' order by '+@orderfield+' asc' + @orderstr+' ) as a where 1=1 and '+@keyfield+' not in ( 
 
select top ''+cast(@curpagenum as varchar)+'' '+@keyfield+' from '+@tablename+' where 1=1 '+@strwhere+' 
 
order by '+@orderfield +' asc' + @orderstr+') order by '+@orderfield +' asc'';'
    end
    set @sqlstr=@sqlstr+'execute( @sqlstr)'
    print @sqlstr
execute(@sqlstr)
GO

posted on 2006-12-19 22:24 几米天空 阅读(3631) 评论(21) 编辑 收藏

评论

#1楼 2007-02-02 11:37 LI[未注册用户]
数据量大了 会不会很慢呢??
 回复 引用   

#2楼[楼主] 2007-02-05 17:48 几米天空      
呵呵..这个要看你的数据库怎么设计了..主要的还是看那个order by,我们一般都是用一个递增的id作为主健,但是数据量大的时候速度就慢了..很多情况下用时间会更快些..因为索引的时候用id是没有什么优势的
 回复 引用 查看   

#3楼 2007-10-11 11:07 ouda[未注册用户]
为什么我也是这个样子写的,但用.net调用的时候得不到数据的呢:
ALTER PROCEDURE [dbo].[GetList] ---http://lanlansky.bokee.com/viewdiary.15823515.html
(
@tableName nvarchar(300),----表名
@PKColumnt nvarchar(300) , --关键字段
@StrCondiction nvarchar(4000),------条件语句
@OrderColumnt nvarchar(300),
@Sort nvarchar(5)='desc', --排列方式
@pageNO bigint , --页码
@pageSize int --多少条记录
)as

‘’--------------------------操作基方法
Public Function RunProcedure(ByVal ProName As String, ByVal Parameters As IDataParameter()) As DataTable
Dim ds As DataSet = New DataSet
Dim adapter As New SqlDataAdapter()
BuiltSQLCmd(ProName, Parameters)
adapter.SelectCommand = cmd
conn.Open()
adapter.Fill(ds, "mytb")
conn.Close()
Return ds.Tables("mytable")

End Function

Private Sub BuiltSQLCmd(ByVal ProName As String, ByVal Parameters As IDataParameter())
cmd.CommandText = ProName
cmd.Connection = conn
cmd.CommandType = CommandType.StoredProcedure
Dim parameter As SqlParameter
For Each parameter In Parameters
cmd.Parameters.Add(parameter)
Next
End Sub


'-----------调用

Dim Parameters As Data.SqlClient.SqlParameter() = {New SqlParameter("@tableName", Data.SqlDbType.NVarChar) _
, New SqlParameter("@PKColumnt", Data.SqlDbType.NVarChar) _
, New SqlParameter("@StrCondiction", Data.SqlDbType.NVarChar) _
, New SqlParameter("@OrderColumnt", Data.SqlDbType.NVarChar) _
, New SqlParameter("@Sort", Data.SqlDbType.NVarChar) _
, New SqlParameter("@pageNO", Data.SqlDbType.BigInt) _
, New SqlParameter("@pageSize", Data.SqlDbType.BigInt) _
}
Parameters(0).Value = "事项受理审批办结表"
Parameters(1).Value = "受理代码"
Parameters(2).Value = ""
Parameters(3).Value = "申请时间"
Parameters(4).Value = ""
Parameters(5).Value = 1
Parameters(6).Value = 5
Dim mytb As Data.DataTable = dbc.RunProcedure("getlist", Parameters)
' Response.Write(mytb.Rows.Count.ToString())
Me.GridView1.DataSource = mytb
Me.GridView1.DataBind()

'=======================================

如直接在数据库在运行

dbo.GetList '表名,'1d,' ','受理日期','',1100,20
是正常的,
moomwy@163.com。谢谢大虾!
 回复 引用   

#4楼 2007-10-11 11:30 ouda[未注册用户]
不好意思各位,是下面那个名字出错的问题。mytb与mytable

adapter.Fill(ds, "mytb")
conn.Close()
Return ds.Tables("mytable")


 回复 引用   

#5楼 2007-10-17 14:57 yun[未注册用户]
这个在sql2000上面可以运行吗?请问有没有sql2000上面分页的存储过程?请大家帮忙
 回复 引用   

#6楼[楼主] 2007-10-18 16:10 几米天空      
这个就是sql2000的,2005上的更简单,微软自带就有一个分页的.
 回复 引用 查看   

#7楼 2008-07-19 18:00 侯垒      
@几米天空
微软自带的就有一个分页的?是什么呀?
请楼主能不能说的清楚一些,还有具体怎么用?
 回复 引用 查看