zoukankan      html  css  js  c++  java
  • 通用分页存储过程

    /*
    名称:spAll_ReturnRows
    输入:
    输出:
    调用:
      EXEC spAll_ReturnRows 'SELECT  * FROM 表名', 页号, 返回记录数, '主键', '排序字段'
      spAll_ReturnRows 'SELECT  * FROM all_Categories',2,10,'[ID]','[ID]'
    说明:[百万级]通用存储过程.分页存储过程..返回指定返回条数、指定页数的记录
    作者:Dili J.F. Senders
      邮件:diliatwellknow.net
      网站:http://www.wellknow.net
      更新:20040610
      支持:http://bbs.wellknow.net
    */

    CREATE PROCEDURE dbo.spAll_ReturnRows
    (
    @SQL nVARCHAR(4000),
    @Page int,
    @RecsPerPage int,
    @ID VARCHAR(255),
    @Sort VARCHAR(255)
    )
    AS

    DECLARE @Str nVARCHAR(4000)

    SET @Str='SELECT   TOP '+CAST(@RecsPerPage AS VARCHAR(20))+' * FROM ('+@SQL+') T WHERE

    T.'+@ID+' NOT IN
    (SELECT   TOP '+CAST((@RecsPerPage*(@Page-1)) AS VARCHAR(20))+' '+@ID+' FROM ('+@SQL+') T9

    ORDER BY '+@Sort+') ORDER BY '+@Sort

    PRINT @Str

    EXEC sp_ExecuteSql @Str
    GO

    CREATE PROCEDURE GetRecordFromPage
    @tblName varchar(255), -- 表名
    @fldName varchar(255), -- 字段名
    @PageSize int = 10, -- 页尺寸
    @PageIndex int = 1, -- 页码
    @IsCount bit = 0, -- 返回记录总数, 非 0 值则返回
    @OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
    @strWhere varchar(4000) = '' -- 查询条件 (注意: 不要加 where)
    AS

    declare @strSQL varchar(6000) -- 主语句
    declare @strTmp varchar(6000) -- 临时变量
    declare @strOrder varchar(6000) -- 排序类型

    if @OrderType != 0
    begin
    set @strTmp = "<(select min"
    set @strOrder = " order by [" + @fldName +"] desc"
    end
    else
    begin
    set @strTmp = ">(select max"
    set @strOrder = " order by [" + @fldName +"] asc"
    end

    set @strSQL = "select top " + str(@PageSize) + " * from ["
    + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
    + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
    + @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"
    + @strOrder

    if @strWhere != ''
    set @strSQL = "select top " + str(@PageSize) + " * from ["
    + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
    + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
    + @fldName + "] from [" + @tblName + "] where (" + @strWhere + ") "
    + @strOrder + ") as tblTmp) and (" + @strWhere + ") " + @strOrder

    if @PageIndex = 1
    begin
    set @strTmp = ""
    if @strWhere != ''
    set @strTmp = " where (" + @strWhere + ")"

    set @strSQL = "select top " + str(@PageSize) + " * from ["
    + @tblName + "]" + @strTmp + " " + @strOrder
    end

    if @IsCount != 0
    set @strSQL = "select count(*) as Total from [" + @tblName + "]"

    exec (@strSQL)
    GO

    CREATE PROCEDURE dbo.GetPageRecord
    (
    @tblName varchar(255), -- 表名
    @fldlist varchar(1000)='*',
    @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 #temp
    (
    RecNo int IDENTITY (1, 1) NOT 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 #temp (oldid) '+@sqlstr
    execute(@sqlstr)
    set @sqlstr='SELECT '+@fldList+' FROM '+@tblname+' TableA (nolock), #temp 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)
    GO

    create PROCEDURE dbo.GetPagingData
    (
    @tablename varchar(100),--表名或视图表
    @fieldlist varchar(4000)='*',--欲选择字段列表
    @orderfield varchar(100),--排序字段
    @keyfield varchar(100),--主键
    @pageindex int,--页号,从0开始
    @pagesize int=20,--页尺寸
    @strwhere varchar(4000),--条件
    @ordertype bit=1--排序,1,降序,0,升序
    )
    AS
    /**//*
    名称:GetPagingRecord
    作用:按任意字段进行排序分页
    作者:菩提树(MARK MA)
    时间:2004-12-14
    声明:此代码你可以无偿使用及转载,但在转载时,请勿移称本文字声明
    */
    SET NOCOUNT ON
    declare @sqlstr varchar(6000)
    --处理SQL中危险字符,并且将条件处理成易嵌入的形式
    set @sqlstr='declare @Rcount int;'
    set @sqlstr=@sqlstr+'set @rcount=(select count('+@keyfield+') from '+@tablename+' where

    '+@strWhere+');'
    set @strwhere=replace(@strwhere,'''','''''')
    set @strwhere=replace(@strwhere,'--','')
    set @strwhere=replace(@strwhere,';','')
    set @sqlstr=@sqlstr+'declare @Rnum int;'
    set @sqlstr=@sqlstr+'set @rnum=@rcount-'+cast(@pagesize as varchar)+'*'+cast(@pageindex as

    varchar)+';'
    set @sqlstr=@sqlstr+'declare @sqlstr varchar(6000);'
    if @ordertype=1
    begin
    set @sqlstr=@sqlstr+'set @sqlstr=''select top '+cast(@Pagesize as varchar)+' '+@fieldlist+'

    from (select top 100

    percent * from (select top ''+cast(@rnum as varchar)+'' * from '+@tablename+' where

    '+@strwhere+'

    order by '+@orderfield+' asc) as b order by paymoney desc) as a order by '+@orderfield+'

    desc '';'
    end
    else
    begin
    set @sqlstr=@sqlstr+'set @sqlstr=''select top '+cast(@Pagesize as varchar)+' '+@fieldlist+'

    from (select top 100

    percent * from (select top ''+cast(@rnum as varchar)+'' * from '+@tablename+' where

    '+@strwhere+'

    order by '+@orderfield+' desc) as b order by paymoney asc) as a order by '+@orderfield+' asc

    '';'
    end
    set @sqlstr=@sqlstr+'if @Rcount>0 begin execute(@sqlstr) end'
    --print @sqlstr
    execute(@sqlstr)
    在上面的代码中,还处理了没有符合条件结果的情况
    第二种方案的思想是这样的,先用倒序的SELECT TOP (页序号+1)*页尺寸的方法取得AE结果集,再从AE结果

    集中用NOT IN 的方法排除掉用SELECT TOP 页序号*页尺寸的方法取得的结果集,最后,对目标结果集执行

    倒序,下面是实现的代码
    create PROCEDURE dbo.GetPagingRecord
    (
    @tablename varchar(100),--表名或视图表
    @fieldlist varchar(4000)='*',--欲选择字段列表
    @orderfield varchar(100),--排序字段
    @keyfield varchar(100),--主键
    @pageindex int,--页号,从0开始
    @pagesize int=20,--页尺寸
    @strwhere varchar(4000),--条件
    @ordertype bit=1--排序,1,降序,0,升序
    )
    AS
    /**//*
    名称:GetPagingRecord
    作用:按任意字段进行排序分页
    作者:菩提树(MARK MA)
    时间:2004-12-14
    声明:此代码你可以无偿使用及转载,但在转载时,请勿移称本文字声明
    */
    SET NOCOUNT ON
    declare @sqlstr varchar(6000)
    --处理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 as varchar)+'*'+cast(@Pagesize as

    varchar)+';'
    set @sqlstr=@sqlstr+'set @nextpagenum='+cast(@PageIndex+1 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 '+@strwhere+' order by '+@orderfield+' desc ) as a where '+@keyfield+'

    not in (

    select top ''+cast(@curpagenum as varchar)+'' '+@keyfield+' from '+@tablename+' where

    '+@strwhere+'

    order by '+@orderfield+' desc) order by '+@orderfield+' desc'';'
    end
    else
    begin
    set @sqlstr=@sqlstr+'set @sqlstr=''select '+@fieldlist+' from ( select top ''+cast

    (@nextpagenum as varchar)+'' * from

    '+@tablename+' where '+@strwhere+' order by '+@orderfield+' asc ) as a where '+@keyfield+'

    not in (

    select top ''+cast(@curpagenum as varchar)+'' '+@keyfield+' from '+@tablename+' where

    '+@strwhere+'

    order by '+@orderfield+' asc) order by '+@orderfield+' asc'';'
    end
    set @sqlstr=@sqlstr+'execute( @sqlstr)'
    --print @sqlstr
    execute(@sqlstr)
    需要注意的是,如果要避免SQL注入式攻击,请注意处理像分号,双减号,单引号这些在SQL中有特殊含义的字

  • 相关阅读:
    C#利用反射动态调用类及方法
    系统程序监控软件
    SQL server 2008 安装和远程访问的问题
    sql server 创建临时表
    IIS 时间问题
    windows 2008 安装 sql server 2008
    sql server xml nodes 的使用
    Window 7sp1 安装vs2010 sp1 打开xaml文件崩溃
    CSS资源网址
    Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0
  • 原文地址:https://www.cnblogs.com/EasonWu/p/1085488.html
Copyright © 2011-2022 走看看