zoukankan      html  css  js  c++  java
  • 利用存储过程实现分页 ,并且多条件查询

    use shifenzheng
    if exists(SELECT name FROM sysobjects WHERE name = 'sp_PageNumSelect1' AND type = 'P')
    drop proc sp_PageNumSelect
    go
    create proc sp_PageNumSelect
    (
    @pageSize int,
    @pageIndex int,
    @name varchar(50),
    @Mobile varchar(50),
    @address varchar(50),
    @zip varchar(6),
    @Email varchar(50),
    @start datetime,
    @end datetime
    )

    as
    declare @strSql varchar(2000) --主语句
    declare @strCountSql varchar(2000) -- 总记录主语句
    declare @strWhere varchar(100)
    set @strWhere=''
    --姓名
    if @name<>''
    begin
    set @strWhere=@strWhere+'name='''+@name+''' and '
    end
    ---手机
    if @Mobile<>''
    begin
    set @strWhere=@strWhere+'Mobile='''+@Mobile+''' and '
    end
    --地址
    if @address<>''
    begin
    set @strWhere=@strWhere+'address like('''+'%'+@address+'%'+''') and '
    end
    --邮编
    if @zip<>''
    begin
    set @strWhere=@strWhere+'zip='''+@zip+''' and '
    end
    --邮箱
    if @Email<>''
    begin
    set @strWhere=@strWhere+'Email='''+@Email+''' and '
    end
    --开始时间
    if @Email<>''
    begin
    set @strWhere=@strWhere+'Version>='''+@start+''' and '
    end
    --结束时间
    if @Email<>''
    begin
    set @strWhere=@strWhere+'Version<='''+@end+''' and '
    end

    if @strWhere<>''
    Begin
    set @strSql='select top ('+str(@pageSize)+') id,Name,ctfid,Gender,Birthday,[Address],Zip,Mobile,Tel,Fax,EMail,Nation,Education,
    Company,[Version] from cdsgus0
    where '+(@strWhere)+' id>isnull((select MAX(id) from cdsgus0 where id in(select top ('+str(@pageSize*(@pageIndex-1))+') id from cdsgus0 where '+@strWhere+' 1=1)),0)';


    set @strCountSql = 'select count(id) from cdsgus0 where '+@strWhere+' 1=1';

    End
    else
    Begin

    set @strSql='select top '+str(@pageSize)+' id,Name,ctfid,Gender,Birthday,[Address],Zip,Mobile,Tel,Fax,EMail,Nation,Education,
    Company,[Version] from cdsgus
    where id>isnull((select MAX(id) from cdsgus where id in(select top ('+str(@pageSize*(@pageIndex-1))+') id from cdsgus)),0)'

    set @strCountSql='select 20000000'
    End

    exec(@strSql);
    exec(@strCountSql);
    go


    exec sp_PageNumSelect 20,1,'','','','','','',''

    其中在sql中 '',两个单引号是转义符号,转义成一个单引号

    一般有变量时出现数据类型转换失败,一般都是sql语句拼接错误造成。将变量转换为字符换类型即可。

    cast(@pageSize as varchar(50))

    (利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句

    (利用Not In和SELECT TOP分页)   效率次之,需要拼接SQL语句

    (利用SQL的游标存储过程分页)    效率最差,但是最为通用

    经验在于积累----武二郎
  • 相关阅读:
    【POJ 3162】 Walking Race (树形DP-求树上最长路径问题,+单调队列)
    【POJ 2152】 Fire (树形DP)
    【POJ 1741】 Tree (树的点分治)
    【POJ 2486】 Apple Tree (树形DP)
    【HDU 3810】 Magina (01背包,优先队列优化,并查集)
    【SGU 390】Tickets (数位DP)
    【SPOJ 2319】 BIGSEQ
    【SPOJ 1182】 SORTBIT
    【HDU 5456】 Matches Puzzle Game (数位DP)
    【HDU 3652】 B-number (数位DP)
  • 原文地址:https://www.cnblogs.com/zhanghai/p/4461186.html
Copyright © 2011-2022 走看看