sqlserver 存储过程 分页搜索查询

时间:2022-10-09 14:05:34

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

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