帮忙写个分页模糊查询存储过程.
我要实现的方法IList<Storage>QueryStorages(stringproName,stringwarehouse,intpageNo,intpageSiz...
我要实现的方法IList<Storage> QueryStorages(string proName,
string warehouse,int pageNo,int pageSize)
proName 产品,
warehouse 仓库,
pageNo 当前页编号,
pageSize 页大小
创建存储过程名称"Proc_QueryStorages"
页面调用的时候直接返回SqlDataReader
其实我也试过拼凑来实现,但那个效果不是很理想。
有思路的高手帮忙写下。 展开
string warehouse,int pageNo,int pageSize)
proName 产品,
warehouse 仓库,
pageNo 当前页编号,
pageSize 页大小
创建存储过程名称"Proc_QueryStorages"
页面调用的时候直接返回SqlDataReader
其实我也试过拼凑来实现,但那个效果不是很理想。
有思路的高手帮忙写下。 展开
1个回答
展开全部
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
(
@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
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询