zoukankan      html  css  js  c++  java
  • sqlserver 存储过程 分页搜索查询

    具体调用实例见代码最后一行注释区域

    --if exists(select * from sysobjects where id = object_id(N'page_search') and type = 'P')
    --drop PROCEDURE [dbo].[page_search]
    --go
    CREATE PROCEDURE [dbo].[page_search2](
        @strTable varchar(50),             --要查询的表
        @strColumn varchar(500),           --要查询的字段(*表示全部字段)
        @left_join_table varchar(500),     --多表联查的表名,多个表之间用,隔开
        @on_ori nvarchar(1000),            --多表联查的条件,源表@strTable字段
        @on_goal nvarchar(1000),           --多表联查的条件,目标表@left_join_table对应字段,多个字段之间用,隔开
        @and_search nvarchar(1000),        --搜索条件,多个字段之间用,隔开
        @calc varchar(1000),               --运算符
        @and_search_value nvarchar(1000),  --搜索条件的值,多个值之间用,隔开
        @startindex varchar(10)=0,         --起始索引
        @perPage varchar(10) = 10          --每页条数
    )
    WITH ENCRYPTION
    AS
    BEGIN SET NOCOUNT ON;
    --变量
    declare @sqlString nvarchar(4000)='';  --完整的select语句
    declare @sql_1 varchar(500)='';        --sql条件1
    declare @sql_2 varchar(500)='';        --sql条件2  连表查询条件
    declare @sql_3 varchar(500)='';        --sql条件3  搜索条件
    declare @sqlString2 nvarchar(4000)=''; --完整的select语句
    declare @curr_table int;               --表--字符串的当前位置
    declare @curr_field int;               --字段--字符串的当前位置
    declare @curr_search_k int;            --表--字符串的当前位置
    declare @curr_search_v int;            --字段--字符串的当前位置
    declare @curr_calc int;                --运算符--字符串的当前位置
    declare @num1 int;             --连表查询表的个数
    declare @num2 int;             --搜索条件个数
    declare @prev1 int;            --字段--字符串的当前位置
    declare @prev2 int;            --字段--字符串的当前位置
    declare @prev3 int;            --字段--字符串的当前位置
    declare @prev4 int;            --字段--字符串的当前位置
    declare @prev5 int;            --字段--字符串的当前位置
    declare @res varchar(20);    
    declare @rrr varchar(200);
    --变量赋初值
    set @num1=(len(@left_join_table)-len(replace(@left_join_table,',','')))+1;  --print @num1;  --3
    set @num2=(len(@and_search)-len(replace(@and_search,',','')))+1;            --print @num2; --6
    set @prev1=1;
    set @prev2=1;
    set @prev3=1;
    set @prev4=1;
    set @prev5=1;
    set @sql_1='SELECT rowNum =ROW_NUMBER() over (order by '+@strTable+'.'+@on_ori+'),'+ @strColumn+' FROM ' +@strTable;
        --开始循环处理--处理连表查询部分
        while ( @num1 > 0)
            begin
                set @curr_table=charindex(',',@left_join_table,@prev1); --print @curr_table -- 20 39 0
                set @curr_field= charindex(',',@on_goal,@prev2);        --print @curr_field -- 3  12 0
                
                if @num1>1
                    begin
                        set @sql_2 =' left join '+substring(@left_join_table,@prev1,@curr_table-@prev1)+' on '+@strTable+'.'+@on_ori+'='+substring(@left_join_table,@prev1,@curr_table-@prev1)+'.'+substring(@on_goal,@prev2,@curr_field-@prev2)+''+@sql_2;
                    end
                else--最后一个
                    begin
                        set @sql_2 =@sql_2 + ' left join '+substring(@left_join_table,@prev1,len(@left_join_table)-@prev1+1)+' on '+@strTable+'.'+@on_ori+'='+substring(@left_join_table,@prev1,len(@left_join_table)-@prev1+1)+'.'+substring(@on_goal,@prev2,len(@on_goal)-@prev2+1);
                        break;
                    end
                set @num1=@num1-1;
                set @prev1=@curr_table+1;
                set @prev2=@curr_field+1;
            end
        --开始循环处理--处理搜索条件部分
        while ( @num2 > 0)
            begin
                set @curr_search_k= charindex(',',@and_search,@prev3);       
    --print @curr_search_k -- 8 17 21 34 40 0 set @curr_search_v= charindex(',',@and_search_value,@prev4);
    --print @curr_search_v -- 12 17 22 27 32 0 set @curr_calc= charindex(',',@calc,@prev5);
    --print @curr_search_v -- 12 17 22 27 32 0 if @num2>1 begin set @res=substring(@calc,@prev5,@curr_calc-@prev5); set @rrr=substring(@and_search_value,@prev4,@curr_search_v-@prev4); print @rrr if ( @res = 'LIKE' ) set @sql_3 = ' and ('+substring(@and_search_value,@prev4,@curr_search_v-@prev4)+' IS NULL OR '+substring(@and_search,@prev3,@curr_search_k-@prev3)+' LIKE '+@rrr+')'+''+@sql_3; else set @sql_3 = ' and ('+substring(@and_search_value,@prev4,@curr_search_v-@prev4)+' IS NULL OR '+substring(@and_search,@prev3,@curr_search_k-@prev3)+' '+substring(@calc,@prev5,@curr_calc-@prev5)+' '+substring(@and_search_value,@prev4,@curr_search_v-@prev4)+')'+''+@sql_3; end else--最后一个 begin set @res=substring(@calc,@prev5,len(@calc)-@prev5+1); set @rrr=substring(@and_search_value,@prev4,len(@and_search_value)-@prev4+1); if ( @res = 'LIKE' ) begin set @sql_3 =@sql_3 + ' and ('+substring(@and_search_value,@prev4,len(@and_search_value)-@prev4+1)+' IS NULL OR '+substring(@and_search,@prev3,len(@and_search)-@prev3+1)+' LIKE '+@rrr+')'; break; end else begin set @sql_3 =@sql_3 + ' and ('+substring(@and_search_value,@prev4,len(@and_search_value)-@prev4+1)+' IS NULL OR '+substring(@and_search,@prev3,len(@and_search)-@prev3+1)+' '+substring(@calc,@prev5,len(@calc)-@prev5+1)+' '+substring(@and_search_value,@prev4,len(@and_search_value)-@prev4+1)+')'; break; end end set @num2=@num2-1; set @prev3=@curr_search_k+1; set @prev4=@curr_search_v+1; set @prev5=@curr_calc+1; end set @sqlString=@sql_1+@sql_2+' where 1=1 '+@sql_3 set @sqlString2='select top('+@perPage+') rowNum,totalNum = (select count(0) from ('+@sqlString+') as cte),pageCount=ceiling((((select count(0) from ('+@sqlString+') as cte )+0.0))/CAST('+@perPage+' as varchar)),'+@strColumn+' from ('+@sqlString+') as cte where rowNum > '+@startindex+' order by rowNum ASC'; PRINT @sqlString exec(@sqlString2) END --execute [dbo].[page_search2] "base._Member",'AcctNbr,AcctName,ssn,Since,DiffEligible,DiffCardOn,CurrSelfRank','base._MemberProfile,tree._Node,tree._Leaf','ID','ID,MemberID,MemberID','AcctNbr,AcctName,SSN,CurrSelfRank,Since,Since',"=,LIKE,=,=,>,<","null,'zouke%',null,null,null,null","1","10"
    if exists(select * from sysobjects where id = object_id(N'page_search') and type = 'P')
    drop PROCEDURE [dbo].[page_search]
    go
    CREATE PROCEDURE [dbo].[page_search](
        @startindex int=0,
        @perPage int = 10,
        @acctNbr varchar(100)=null,
        @user_name nvarchar(100)=null,
        @ssn varchar(100)=null,
        @rank varchar(100)=null,
        @from_since varchar(100)=null,
        @to_since varchar(100)=null
    )
    WITH ENCRYPTION
    AS
    BEGIN SET NOCOUNT ON;
    
    with cte as(
        select 
            rowNum = ROW_NUMBER() over (order by base._Member.ID),
            AcctNbr,
            AcctName,
            ssn,
            tree._Leaf.CountryID,
            Since,
            DiffEligible,
            DiffCardOn,
            CurrSelfRank 
        from base._Member 
        left join base._MemberProfile on base._Member.ID=base._MemberProfile.ID 
        left join tree._Node on base._Member.ID= tree._Node.MemberID 
        left join tree._Leaf on base._Member.ID= tree._Leaf.MemberID 
        where 1=1 
            and (@acctNbr IS NULL OR AcctNbr = @acctNbr) 
            --and (@user_name IS NULL OR AcctName = @user_name)
            and (@user_name IS NULL OR AcctName LIKE @user_name + '%')
            and (@ssn IS NULL OR SSN = @ssn)
            and (@rank IS NULL OR CurrSelfRank = @rank)
            and (@from_since IS NULL OR Since > @from_since)
            and (@to_since IS NULL OR Since < @to_since)
    )
    select top(@perPage) 
        rowNum,
        totalNum = (select count(0) from cte),
        pageCount=ceiling((((select count(0) from cte)+0.0))/CAST(@perPage as varchar)),
        AcctNbr,
        AcctName,
        ssn,
        CountryID,
        Since,DiffEligible,
        DiffCardOn,
        CurrSelfRank 
    from cte
    where rowNum > @startindex
    order by rowNum ASC    
    END
    --execute [dbo].[GetMemberInfo3] 0,1000,null,null,null,null,'2012-05-16','2013-05-16'
  • 相关阅读:
    设计模式(Design Pattern)扫盲
    SharePoint 2007 采用表单验证 (1) 失败:(
    发布一款给图片批量加水印的程序PicNet V1.0
    转篇文章,VS2005开发的dll如何安装进GAC
    cnblogs排名进入1500,纪念一下
    转载一篇提高baidu/google收录的文章
    关于.NET(C#)中字符型(Char)与数字类型的转换, CLR via c# 读书笔记
    《天风文章》V1.2.0 新闻/文章类asp.net2.0站点系统源码 (100%开源)
    推荐个.Net的论坛系统 Discuz!NT
    C#实现对图片加水印的一段代码.
  • 原文地址:https://www.cnblogs.com/zouke1220/p/7459334.html
Copyright © 2011-2022 走看看