首页 > 技术文章 > sqlserver 存储过程 分页搜索查询

zouke1220 2017-09-01 09:59 原文

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

--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'

 

推荐阅读