求:带条件查询的分页SQL !!!

xianglangvip 2011-04-08 02:17:58
如题:求带条件查询的分页SQL语句,谢谢
...全文
155 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
幸福的流浪 2011-04-08
  • 打赏
  • 举报
回复
很简单的分页存储过程
create PROCEDURE [dbo].[lc_ListPage](
@strSql varchar(8000),--查询sql,如select * from [user]
@recdIndex int,--当前记录位置
@PageSize int,--每页显示记录
@totalCount int output --记录总数
)
AS
set nocount on
declare @p1 int
declare @RowCount int
set @RowCount = 0
declare @PageCount int
set @PageCount = 0
exec sp_cursoropen @p1 output,@strSql,@scrollopt=1,@ccopt=1,@rowcount=@rowCount output --得到总记录数
set @PageCount=ceiling(1.0*@rowCount/@pagesize) --得到总页数
set @recdIndex=IsNull(@recdIndex,0)+1
set @totalCount=@rowCount
--select @RowCount,@PageCount
exec sp_cursorfetch @p1,16,@recdIndex,@PageSize
exec sp_cursorclose @p1
set nocount off
--小F-- 2011-04-08
  • 打赏
  • 举报
回复
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go





ALTER PROC [dbo].[PROCE_PageView2000]
(
@tbname nvarchar(100), --要分页显示的表名
@FieldKey nvarchar(1000), --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
@PageCurrent int=1, --要显示的页码
@PageSize int=10, --每页的大小(记录数)
@FieldShow nvarchar(1000)='', --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
@FieldOrder nvarchar(1000)='', --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
@WhereString nvarchar(1000)=N'', --查询条件
@RecordCount int OUTPUT --总记录数
)
AS
SET NOCOUNT ON
--检查对象是否有效
--IF OBJECT_ID(@tbname) IS NULL
--BEGIN
-- RAISERROR(N'对象"%s"不存在',1,16,@tbname)
-- RETURN
--END
--IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
-- AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
-- AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
--BEGIN
-- RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
-- RETURN
--END

--分页字段检查
IF ISNULL(@FieldKey,N'')=''
BEGIN
RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
RETURN
END

--其他参数检查及规范
IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
IF ISNULL(@PageSize,0)<1 SET @PageSize=10
IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
IF ISNULL(@FieldOrder,N'')=N''
SET @FieldOrder=N''
ELSE
SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)
IF ISNULL(@WhereString,N'')=N''
SET @WhereString=N''
ELSE
SET @WhereString=N'WHERE ('+@WhereString+N')'

--如果@RecordCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@RecordCount赋值)
IF @RecordCount IS NULL
BEGIN
DECLARE @sql nvarchar(4000)
SET @sql=N'SELECT @RecordCount=COUNT(*)'
+N' FROM '+@tbname
+N' '+@WhereString
EXEC sp_executesql @sql,N'@RecordCount int OUTPUT',@RecordCount OUTPUT
END

--计算分页显示的TOPN值
DECLARE @TopN varchar(20),@TopN1 varchar(20)
SELECT @TopN=@PageSize,
@TopN1=(@PageCurrent-1)*@PageSize

--第一页直接显示
IF @PageCurrent=1
EXEC(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' '+@WhereString
+N' '+@FieldOrder)
ELSE
BEGIN
--处理别名
IF @FieldShow=N'*'
SET @FieldShow=N'a.*'

--生成主键(惟一键)处理条件
DECLARE @Where1 nvarchar(4000),@Where2 nvarchar(4000),
@s nvarchar(1000),@Field sysname
SELECT @Where1=N'',@Where2=N'',@s=@FieldKey
WHILE CHARINDEX(N',',@s)>0
SELECT @Field=LEFT(@s,CHARINDEX(N',',@s)-1),
@s=STUFF(@s,1,CHARINDEX(N',',@s),N''),
@Where1=@Where1+N' AND a.'+@Field+N'=b.'+@Field,
@Where2=@Where2+N' AND b.'+@Field+N' IS NULL',
@WhereString=REPLACE(@WhereString,@Field,N'a.'+@Field),
@FieldOrder=REPLACE(@FieldOrder,@Field,N'a.'+@Field),
@FieldShow=REPLACE(@FieldShow,@Field,N'a.'+@Field)
SELECT @WhereString=REPLACE(@WhereString,@s,N'a.'+@s),
@FieldOrder=REPLACE(@FieldOrder,@s,N'a.'+@s),
@FieldShow=REPLACE(@FieldShow,@s,N'a.'+@s),
@Where1=STUFF(@Where1+N' AND a.'+@s+N'=b.'+@s,1,5,N''),
@Where2=CASE
WHEN @WhereString='' THEN N'WHERE ('
ELSE @WhereString+N' AND ('
END+N'b.'+@s+N' IS NULL'+@Where2+N')'

--执行查询
EXEC(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' a LEFT JOIN(SELECT TOP '+@TopN1
+N' '+@FieldKey
+N' FROM '+@tbname
+N' a '+@WhereString
+N' '+@FieldOrder
+N')b ON '+@Where1
+N' '+@Where2
+N' '+@FieldOrder)
END









MSSQL2005

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go






ALTER PROCEDURE [dbo].[PROCE_SQL2005PAGECHANGE]
(
@TableName varchar(50), --表名
@ReFieldsStr varchar(200) = '*', --字段名(全部字段为*)
@OrderString varchar(200), --排序字段(必须!支持多字段不用加order by)
@WhereString varchar(500) =N'', --条件语句(不用加where)
@PageSize int, --每页多少条记录
@PageIndex int = 1 , --指定当前为第几页
@TotalRecord int output --返回总记录数
)
AS

BEGIN

--处理开始点和结束点
Declare @StartRecord int;
Declare @EndRecord int;
Declare @TotalCountSql nvarchar(500);
Declare @SqlString nvarchar(2000);
set @StartRecord = (@PageIndex-1)*@PageSize + 1
set @EndRecord = @StartRecord + @PageSize - 1
SET @TotalCountSql= N'select @TotalRecord = count(*) from ' + @TableName;--总记录数语句
SET @SqlString = N'(select row_number() over (order by '+ @OrderString +') as rowId,'+@ReFieldsStr+' from '+ @TableName;--查询语句
--
IF (@WhereString! = '' or @WhereString!=null)
BEGIN
SET @TotalCountSql=@TotalCountSql + ' where '+ @WhereString;
SET @SqlString =@SqlString+ ' where '+ @WhereString;
END
--第一次执行得到
--IF(@TotalRecord is null)
-- BEGIN
EXEC sp_executesql @totalCountSql,N'@TotalRecord int out',@TotalRecord output;--返回总记录数
-- END
----执行主语句
set @SqlString ='select * from ' + @SqlString + ') as t where rowId between ' + ltrim(str(@StartRecord)) + ' and ' + ltrim(str(@EndRecord));
Exec(@SqlString)
END
hundanbaobao001 2011-04-08
  • 打赏
  • 举报
回复


USE [Agronet2008]
GO
/****** 对象: StoredProcedure [dbo].[CPP__GetObjectCategoryWithPage] 脚本日期: 09/28/2007 12:41:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

/* ##SUMMARY 从表ObjectCategory中分页提取数据调用方式
-- 如:exec upc_GetDiaryWithPage 10,101,1012 output, 'a.uid,a.title,a.fpath,a.dd,a.isgbook ', 'a.id,a.dd ', '1=1 ', 'a.dd desc ', 'a.dd asc '*/
-- ##REMARKS Authors :aspAutoScript ALTER Date:2007-09-04 00:00:00Z
-- ##PARAM @pageSize 每页数据大小 //用于识别正确值及需要修改的值
-- ##PARAM @pageIndex 当前是第几页,第一页为0,第二页为1,类推。如果页号大于数据最大页数,将自动调整为最后一页 //用于识别正确值及需要修改的值
-- ##PARAM @rowCount 符合where条件的所有记录个数 //用于识别正确值及需要修改的值
-- ##PARAM @columnClause 输出的字段条件,如a.columnA,a.columnB,用逗号分开,必需包含唯一关键字及需要排序的字段(即在orderbyclause中的字段) //用于识别正确值及需要修改的值
-- ##PARAM @orderbyColumn 排序的条件涉及的字段,如columnA ,ColumnB 等格式,这里的列名应该包今一个关键字和需要排序的字段 //用于识别正确值及需要修改的值
-- ##PARAM @whereClause 提取数据的条件 //用于识别正确值及需要修改的值
-- ##PARAM @orderbyClause 排序的条件,如columnA ASC,ColumnB desc等格式 //用于识别正确值及需要修改的值
-- ##PARAM @orderby2Clause 排序的条件的反向条件,如columnA ASC,ColumnB desc等格式 //用于识别正确值及需要修改的值

ALTER PROCEDURE [dbo].[CPP__GetObjectCategoryWithPage](
@pageSize int =10,@pageIndex int=0,@rowCount int =0 output,@columnClause varchar(500)= 'a.* ',
@orderbyColumn varchar(500)= 'a.C_ID ',@whereClause varchar(1000)= ' ',
@orderbyClause varchar(200)= 'a.C_ID ASC ',
@orderBy2Clause varchar(200)= 'a.C_ID DESC '
) AS

SET NOCOUNT ON
SET Transaction Isolation Level Read UNCOMMITTED
DECLARE @strSql varchar(8000) --定义一个存储SQL语句的变量 ");
DECLARE @recordBegin INT
DECLARE @totalPages INT
DECLARE @strWhere2 varchar(100)
DECLARE @culomnSimple varchar(500)
DECLARE @currentPageSize INT --当前页的记录数

DECLARE @rowCountSQL nvarchar(4000) --获得记录数的SQL
DECLARE @rowCountTable table ([rowcount] int) --临时存储记录数的表变量


--判断页码是否正确
IF @pageSize < 0 or @pageIndex < 0
BEGIN
RAISERROR ( '传入的页码或每页记录数大小参数错误! ', 16, 1)
RETURN
END
--计算总记录数 开始
--只有当外部传入的总行数为零或小于零时,才去取总行数,在大于零的情况下,
--系统认为外部已经获得总行数,因此系统内部没有必要再读取一次总行数。
IF @rowCount <=0
BEGIN
SET @rowCountSQL = 'SELECT COUNT(*) FROM [ObjectCategory] AS a WITH(NOLOCK) '
IF NOT (@whereClause is null or RTRIM(@whereClause)= ' ')
BEGIN
SET @rowCountSQL = @rowCountSQL + ' WHERE '+@whereClause
END

INSERT INTO @rowCountTable
EXEC sp_executesql @rowCountSQL
SELECT @rowCount = [rowcount] FROM @rowCountTable
END
--计算总记录数 结束

--如果是第一页
--如果是第一页,直接处理
IF(@pageIndex=0)
BEGIN
SET @strSql = 'SELECT TOP '+CONVERT(VARCHAR(10),@pageSize)+ ' '+@columnClause
SET @strSql = @strSql + ' FROM [ObjectCategory] AS a WITH(NOLOCK) '
IF NOT (@whereClause is null or RTRIM(@whereClause)= ' ')
BEGIN
SET @strSql = @strSql + ' WHERE '+@whereClause
END

IF NOT (@orderbyClause is null or RTRIM(@orderbyClause)= ' ')
BEGIN
SET @strSql = @strSql + ' ORDER BY '+@orderbyClause
END
END
ELSE
BEGIN
--计算数据的总页数
SET @totalPages = CASE WHEN @RowCount%@pageSize =0 THEN @rowCount / @pageSize ELSE @rowCount/@pageSize + 1 END

--如果是最后一页
IF(@pageIndex > = @totalPages -1)
BEGIN
--计算最后一页的行数
SET @currentPageSize = @rowCount - @pageIndex * @pageSize
WHILE(@currentPageSize < 0)
BEGIN
SET @currentPageSize = @pageSize + @currentPageSize
END

SET @strSql = 'SELECT TOP '+CONVERT(VARCHAR(10),@currentPageSize)+ ' '+ @columnClause
SET @strSql = @strSql +char(10)+char(13)+ ' FROM [ObjectCategory] AS a WITH(NOLOCK) '
SET @strSql = @strSql +char(10)+char(13)+ ' INNER JOIN ( '

SET @strSql = @strSql +char(10)+char(13)+ ' SELECT TOP '+CONVERT(VARCHAR(10),@currentPageSize)+ ' C_ID '
SET @strSql = @strSql +char(10)+char(13)+ ' FROM [ObjectCategory] AS a WITH(NOLOCK) '

IF NOT (@whereClause is null or RTRIM(@whereClause)= ' ')
BEGIN
SET @strSql = @strSql +char(10)+char(13)+ ' WHERE '+@whereClause
END

IF NOT (@orderby2Clause is null or RTRIM(@orderby2Clause)= ' ')
BEGIN
SET @strSql = @strSql +char(10)+char(13)+ ' ORDER BY '+@orderby2Clause
END

SET @strSql = @strSql + ' ) AS c '
SET @strSql = @strSql + ' ON a.C_ID = c.c_ID '

IF NOT (@orderbyClause is null or RTRIM(@orderbyClause)= ' ')
BEGIN
SET @strSql = @strSql +char(10)+char(13)+ ' ORDER BY '+@orderbyClause
END
END

ELSE
BEGIN
--如果在前半数的记录页
IF(@pageIndex <= @totalPages/2)
BEGIN
SET @strSql = 'SELECT TOP '+CONVERT(VARCHAR(10),@pageSize)+ ' '+@columnClause
SET @strSql = @strSql + ' FROM [ObjectCategory] AS a WITH(NOLOCK) '
SET @strSql = @strSql +char(10)+char(13)+ ' INNER JOIN ( '

SET @strSql = @strSql +char(10)+char(13)+ ' SELECT TOP '+CONVERT(VARCHAR(10),@pageSize)+ ' * FROM ( '

SET @strSql = @strSql +char(10)+char(13)+ ' SELECT TOP '+CONVERT(VARCHAR(10),@pageSize * (@pageIndex+1))+ ' '+@orderbyColumn
SET @strSql = @strSql +char(10)+char(13)+ ' FROM [ObjectCategory] AS a '
IF NOT (@whereClause is null or RTRIM(@whereClause)= ' ')
BEGIN
SET @strSql = @strSql + ' WHERE '+@whereClause
END

IF NOT (@orderbyClause is null or RTRIM(@orderbyClause)= ' ')
BEGIN
SET @strSql = @strSql + ' ORDER BY '+@orderbyClause
END

SET @strSql = @strSql + ' ) AS a '
SET @strSql = @strSql +char(10)+char(13)+ ' ORDER BY '+@orderby2Clause
SET @strSql = @strSql +char(10)+char(13)+ ' ) AS C '
SET @strSql = @strSql + ' ON a.C_ID = c.c_ID '

IF NOT (@orderbyClause is null or RTRIM(@orderbyClause)= ' ')
BEGIN
SET @strSql = @strSql + ' ORDER BY '+@orderbyClause
END

END
ELSE
BEGIN
--如果是后半数页
SET @strSql = ' SELECT TOP '+CONVERT(VARCHAR(10),@pageSize)+ ' '+@columnClause
SET @strSql = @strSql + ' FROM [ObjectCategory] AS a WITH(NOLOCK) '

SET @strSql = @strSql +char(10)+char(13)+ ' INNER JOIN ( '

SET @strSql = @strSql +char(10)+char(13)+ 'SELECT TOP '+CONVERT(VARCHAR(10),@rowCount - @pageSize * @pageIndex)+ ' '+@orderbyColumn
SET @strSql = @strSql + ' FROM [ObjectCategory] AS a '
IF NOT (@whereClause is null or RTRIM(@whereClause)= ' ')
BEGIN
SET @strSql = @strSql + ' WHERE '+@whereClause
END

IF NOT (@orderbyClause is null or RTRIM(@orderbyClause)= ' ')
BEGIN
SET @strSql = @strSql + ' ORDER BY '+@orderby2Clause
END

SET @strSql = @strSql +char(10)+char(13)+ ' ) AS C '
SET @strSql = @strSql + ' ON a.C_ID = c.c_ID '

IF NOT (@orderbyClause is null or RTRIM(@orderbyClause)= ' ')
BEGIN
SET @strSql = @strSql +char(10)+char(13)+ ' ORDER BY '+@orderbyClause
END

END
END
END
EXEC(@strSql)

RETURN @rowcount
xianglangvip 2011-04-08
  • 打赏
  • 举报
回复
补充一句吧,两张表联合查询 主从表关系
然后分页
cs_lb 2011-04-08
  • 打赏
  • 举报
回复

select ROW_NUMBER() over (order by dm),* from TEST WHERE 1=1
水族杰纶 2011-04-08
  • 打赏
  • 举报
回复
这样问不好说

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧