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