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(), --要查询的表
@strColumn varchar(), --要查询的字段(*表示全部字段)
@left_join_table varchar(), --多表联查的表名,多个表之间用,隔开
@on_ori nvarchar(), --多表联查的条件,源表@strTable字段
@on_goal nvarchar(), --多表联查的条件,目标表@left_join_table对应字段,多个字段之间用,隔开
@and_search nvarchar(), --搜索条件,多个字段之间用,隔开
@calc varchar(), --运算符
@and_search_value nvarchar(), --搜索条件的值,多个值之间用,隔开
@startindex varchar()=, --起始索引
@perPage varchar() = --每页条数
)
WITH ENCRYPTION
AS
BEGIN SET NOCOUNT ON;
--变量
declare @sqlString nvarchar()=''; --完整的select语句
declare @sql_1 varchar()=''; --sql条件1
declare @sql_2 varchar()=''; --sql条件2 连表查询条件
declare @sql_3 varchar()=''; --sql条件3 搜索条件
declare @sqlString2 nvarchar()=''; --完整的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();
declare @rrr varchar();
--变量赋初值
set @num1=(len(@left_join_table)-len(replace(@left_join_table,',','')))+; --print @num1; --
set @num2=(len(@and_search)-len(replace(@and_search,',','')))+; --print @num2; --
set @prev1=;
set @prev2=;
set @prev3=;
set @prev4=;
set @prev5=;
set @sql_1='SELECT rowNum =ROW_NUMBER() over (order by '+@strTable+'.'+@on_ori+'),'+ @strColumn+' FROM ' +@strTable;
--开始循环处理--处理连表查询部分
while ( @num1 > )
begin
set @curr_table=charindex(',',@left_join_table,@prev1); --print @curr_table --
set @curr_field= charindex(',',@on_goal,@prev2); --print @curr_field -- if @num1>
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+)+' on '+@strTable+'.'+@on_ori+'='+substring(@left_join_table,@prev1,len(@left_join_table)-@prev1+)+'.'+substring(@on_goal,@prev2,len(@on_goal)-@prev2+);
break;
end
set @num1=@num1-;
set @prev1=@curr_table+;
set @prev2=@curr_field+;
end
--开始循环处理--处理搜索条件部分
while ( @num2 > )
begin
set @curr_search_k= charindex(',',@and_search,@prev3);
--print @curr_search_k --
set @curr_search_v= charindex(',',@and_search_value,@prev4);
--print @curr_search_v --
set @curr_calc= charindex(',',@calc,@prev5);
--print @curr_search_v --
if @num2>
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+);
set @rrr=substring(@and_search_value,@prev4,len(@and_search_value)-@prev4+);
if ( @res = 'LIKE' )
begin
set @sql_3 =@sql_3 + ' and ('+substring(@and_search_value,@prev4,len(@and_search_value)-@prev4+)+' IS NULL OR '+substring(@and_search,@prev3,len(@and_search)-@prev3+)+' LIKE '+@rrr+')';
break;
end
else
begin
set @sql_3 =@sql_3 + ' and ('+substring(@and_search_value,@prev4,len(@and_search_value)-@prev4+)+' IS NULL OR '+substring(@and_search,@prev3,len(@and_search)-@prev3+)+' '+substring(@calc,@prev5,len(@calc)-@prev5+)+' '+substring(@and_search_value,@prev4,len(@and_search_value)-@prev4+)+')';
break;
end
end
set @num2=@num2-;
set @prev3=@curr_search_k+;
set @prev4=@curr_search_v+;
set @prev5=@curr_calc+;
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","",""
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=,
@perPage int = ,
@acctNbr varchar()=null,
@user_name nvarchar()=null,
@ssn varchar()=null,
@rank varchar()=null,
@from_since varchar()=null,
@to_since varchar()=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 =
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() from cte),
pageCount=ceiling((((select count() 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] ,,null,null,null,null,'2012-05-16','2013-05-16'
sqlserver 存储过程 分页搜索查询的更多相关文章
- sqlserver 存储过程分页管理
-- =============================================-- Author: <Author:刘畅>-- Create date: <Cre ...
- SqlServer 存储过程分页
适用于2005以上版本 create procedure [dbo].[SP_GetPageList] ( @columns nvarchar(max), --查询字段 @tablename nvar ...
- sqlserver存储过程分页
create procedure [dbo].[SqlPager]@sqlstr nvarchar(4000), --查询字符串@currentpage int, --第N页@pagesize in ...
- 分页搜索查询sql
select * from (select t.*,rownum no from " + table + " t where scbj=0)where (no>(" ...
- sqlserver存储过程分页记录
USE [HK_ERP]GO/****** Object: StoredProcedure [dbo].[GetPageBillsByShopID] Script Date: 2018/10/30 1 ...
- SqlServer分页存储过程(多表查询,多条件排序),Repeater控件呈现数据以及分页
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出 ...
- SqlServer存储过程应用二:分页查询数据并动态拼接where条件
前言 开发中查询功能是贯穿全文的,我们来盘一盘使用存储过程分页查询,并且支持动态拼接where条件. 划重点:支持动态拼接where条件 对存储过程的使用有疑问的同学去[SqlServer存储过程的创 ...
- Sqlserver数据库分页查询
Sqlserver数据库分页查询一直是Sqlserver的短板,闲来无事,想出几种方法,假设有表ARTICLE,字段ID.YEAR...(其他省略),数据53210条(客户真实数据,量不大),分页查询 ...
- Oracle、MySql、SQLServer数据分页查询
看过此博文后Oracle.MySql.SQLServer 数据分页查询,在根据公司的RegionRes表格做出了 SQLserver的分页查询语句: 别名.字段 FROM( SELECT row_nu ...
随机推荐
- ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十三节--RBAC模式及ABP权限管理(附送福利)
ABP+AdminLTE+Bootstrap Table权限管理系统一期 Github:https://github.com/Jimmey-Jiang/ABP-ASP.NET-Boilerplate- ...
- PHP制作API接口
需要单一入口文件,可以使用autoload来加载 <?php //获取get参数 $m = !empty($_GET['m'])?$_GET['m']:'Index'; $a = !empty( ...
- DP 网易内推:合唱团
链接:https://www.nowcoder.com/questionTerminal/661c49118ca241909add3a11c96408c8来源:牛客网 [编程题]合唱团 热度指数:18 ...
- Less的转义字符
Less的转义字符 有时候,当需要引入无效的CSS语法或Less不能识别的字符,就需要使用转义字符.此时,就可以在字符串前面加一个 ~,并将需要转义的字符串放在 "" 中.格式为: ...
- selenium 执行js,实现滚动条
今天在写脚本的时候,学习了执行js,实现滚动条,对于scrollTop=10000中这个10000是怎么来的,还不是很了解,先将方法记录一下, 1.滚动条回到顶部: js_up="docum ...
- Java内存模型与Java线程实现原理
硬件的效率与一致性 基于高速缓存的存储交互很好的解决了处理器和内存的速度矛盾,但是也为计算机系统带来了更高的复杂度,因为引入了一个新问题:缓存一致性. 在多处理器系统中,每个处理器都有自己的高速缓存, ...
- 在Github发布自己的compile包
Android入门到转行做服务员--在Github发布自己的compile包 2017-12-05 15:27:10 这是一粒代码发布的第一篇博客,一粒代码从事android开发,近期打算开始搞搞博客 ...
- 基于 HTML5 Canvas 的 3D 碰撞检测
这是公司大神写的一个放官网上给用户学习的例子,我一开始真的不知道这是在干嘛,就只是将三个形状图元组合在一起,然后可以同时旋转.放大缩小这个三个图形,点击"Animate"就能让中间 ...
- codeforces 893A Chess For Three 模拟
893A Chess For Three 思路: 直接模拟即可,第一盘永远是A与B开始 代码: #include <bits/stdc++.h> using namespace std; ...
- CCF-201403-1-相反数
问题描述 试题编号: 201403-1 试题名称: 相反数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 有 N 个非零且各不相同的整数.请你编一个程序求出它们中有多少对相反 ...