分页模糊查询存储过程

CREATE PROCEDURE sp_Paginate
(
        @PageSize INT,--每页的容量,返回记录数小于等于这个值
        @PageIndex INT,--页码
        @ColumnList VARCHAR(1000),--结果集的列名列表,全部列可以用*,列名之间用,隔开
        @Table VARCHAR(128),--这里可以是表名(在单表数据分页时),也可以是视图(在多表数据分页时)
        @KeyColumn VARCHAR(128),--主键列名称,这里的主键列只能是单列,不能是多列
        @SearchText VARCHAR(2000),--查找的字符,可以用空格分开,实现多关键字查询功能
        @SearchColumn VARCHAR(640)--查找的列名,可以用+ '' '' +连接多个列名,意为在多个列中查询
)
AS

DECLARE @Condition VARCHAR(4000)
SET @Condition=dbo.fn_CreateCondition(@SearchText,@SearchColumn)--使用dbo.fn_CreateCondition函数获取空格分开的多关键字查询的条件

DECLARE @SQL VARCHAR(8000)
--生成执行语句
SET @SQL='SELECT TOP ' +CONVERT (VARCHAR(10),@PageSize)
SET @SQL=@SQL+' '+@ColumnList
SET @SQL=@SQL+' FROM'
SET @SQL=@SQL+' ['+@Table+']'
SET @SQL=@SQL+' WHERE'
SET @SQL=@SQL+' ['+@KeyColumn + '] NOT IN'
SET @SQL=@SQL+' (SELECT TOP '+CONVERT(VARCHAR(10),@PageSize*(@PageIndex-1))
SET @SQL=@SQL+' ['+@KeyColumn + ']'
SET @SQL=@SQL+' FROM'
SET @SQL=@SQL+' ['+@Table+']'
SET @SQL=@SQL+' WHERE'
SET @SQL=@SQL+' '+@Condition
SET @SQL=@SQL+')'
SET @SQL=@SQL+' AND ('
SET @SQL=@SQL+@Condition
SET @SQL=@SQL+')'
SET @SQL=@SQL+' ORDER BY ['+@KeyColumn + ']'
EXEC(@SQL)

GO
在sp_Paginate存储过程中用了一个fn_CreateCondition函数, 它是用来把要查询的字符分解(查询的字符可以用空格分开,表示多关键字查询)后,返回一个可用的(如果查询的字符为空,那么返回一个真条件)WHERE条件。以下是fn_CreateCondition的原码及相关注释:


--获取空格分开的多关键字查询的条件函数
CREATE FUNCTION fn_CreateCondition
(
        @SearchText VARCHAR(1000),--查找的字符,可以用空格分开,实现多关键字查询功能
        @SearchColumn VARCHAR(640)--查找的列名,可以用+ '' '' +连接多个列名,意为在多个列中查询
)
RETURNS VARCHAR(4000)
AS
BEGIN
        DECLARE @Condition VARCHAR(4000)
        DECLARE @SearchOneWord VARCHAR(1000)
        DECLARE @CharIndex INT
        DECLARE @OneCondition VARCHAR(4000)

        IF @SearchText=''
               RETURN '1>0'--返回一个为真的条件,表示获取所有结果
        SET @Condition=''
        WHILE @SearchText<>''
        BEGIN
               SET @CharIndex=CHARINDEX(' ',@SearchText)--获取空格的位置,准备取出查找一个查询关键字
               IF @CharIndex=0--没有找到,最后一个查询关键字
               BEGIN
                      SET @SearchOneWord=@SearchText
                      SET @SearchText=''
               END
               ELSE
               BEGIN
                      SET @SearchOneWord=SUBSTRING(@SearchText,1,@CharIndex-1)--找出一个查询关键字
                      SET @SearchText=SUBSTRING(@SearchText,@CharIndex+1,LEN(@SearchText)-@CharIndex)--查询字符串重置于
               END
               SET @SearchOneWord=REPLACE(@SearchOneWord,'''',''''+'''')--考虑到可能查询关键字中可能含有单引号
               SET @OneCondition='CHARINDEX('+''''+@SearchOneWord+''','+@SearchColumn+')>0'
               IF @Condition=''
                      SET @Condition=@OneCondition
               ELSE
                      SET @Condition=@Condition + ' OR '+@OneCondition--多关键字的查询条件关系
        END
        RETURN @Condition
END
GO 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值