分页存储过程问题(带查询条件,不拼SQL语句)

nosuchtracter 2008-03-26 03:30:02
因为数据有好几万条,所以要采用分页
用了AspnetPage分页控件,带不少查询条件,我看了下别人一般都是利用拼SQL语句来完成,考虑安全性能,要求不能拼SQL语句
代码见下

--exec usp_Content_Search '',0,0,0,-1,0,0,'2007-01-01','2008-05-01',10,1
ALTER PROCEDURE usp_Content_Search
(
@Title VARCHAR(500),
@DepartmentId INT, --部门编号
@ItemId INT, --栏目编号
@Positions INT, --位置
@Status INT, --状态
@RoleId INT, --角色
@UserId INT, --用户ID
@StartTime DATETIME,
@EndTime DATETIME,
@PageSize INT, --每页显示的数据
@PageIndex INT --页数
)
AS
BEGIN


CREATE TABLE #indextable (id INT IDENTITY(1,1),nid INT,npositions INT ,branchid INT,nitemid INT,nstatus INT,nuserid INT)
CREATE TABLE #temp(id INT IDENTITY(1,1),nid INT,)
SET NOCOUNT ON
DECLARE @PageLowerBound INT
DECLARE @PageUpperBound INT
SET @PageLowerBound=0
SET @PageUpperBound=0
SET @PageLowerBound =(@PageIndex-1)*@PageSize
SET @PageUpperBound =@PageLowerBound+@PageSize
SET ROWCOUNT @pageUpperBound

DELETE FROM [#indextable]


INSERT INTO [#indextable](nid,npositions,branchid,nitemid,nstatus,nuserid)
SELECT id,[Positions],[DepartmentId],[ItemId],status,[UserId] FROM [Content] WHERE Status<>99 AND [Title] LIKE '%'+@Title+'%'
AND (DATEDIFF(s,PublishedTime,@EndTime)>0) AND (DATEDIFF(s,@StartTime,PublishedTime)>0) ORDER BY id DESC

IF(@DepartmentId<>0)
BEGIN
DELETE FROM #indextable WHERE branchId<>@departmentId
END
IF(@ItemId<>0)
BEGIN
DELETE FROM #indextable WHERE [nitemid]<>@Itemid

END
IF(@UserId<>0)
BEGIN
DELETE FROM #indextable WHERE [nuserid]<>@UserId
END

IF(@Status<>-1)
BEGIN
DELETE FROM #indextable WHERE [nstatus]<>@Status
END

IF(@Positions<>99)
BEGIN
DELETE FROM [#indextable] WHERE [npositions]<>@Positions
END
IF(@RoleId>1)
BEGIN
IF(@RoleId>3)
BEGIN
DELETE FROM #indextable WHERE [nuserid]<>@UserId
END
ELSE
BEGIN
DELETE FROM #indextable WHERE [branchid]<>@DepartmentId
END
END
SET NOCOUNT OFF

INSERT INTO [#temp] ([nid])
SELECT [nid] FROM [#indextable]

SELECT C.*,I.ItemName,U.[RealName] FROM Content c,Item I,[Users] U,#temp t
where C.[ItemId] = I.[ItemId] and C.UserId = U.[UserId] and C.Id=t.nid and t.id > @PageLowerBound AND t.id<= @PageUpperBound
order by C.PublishedTime desc


END

现在就是查询出来的数据不对,如果PageSize为10的话,数据库前10条没有符合条件的数据就查不出来
按要求来说应该是查询出符合条件的前10条啊,先查询,再取前10条,现在是先取再查询了
好像是SET ROWCOUNT @pageUpperBound这一句的问题,如果取消这句,分页速度会影响不?对这句不是很理解
用的是SQL2000
望指教
...全文
322 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Freedom0103 2012-07-19
  • 打赏
  • 举报
回复
看着那么复杂,头晕
GiantHard 2008-03-30
  • 打赏
  • 举报
回复
SET ROWCOUNT { number | @number_var }
使 SQL Server 在返回指定的行数之后停止处理查询。

你应该使用Top来实现你的想法,这也是目前的常规做法.
DshirenJ 2008-03-30
  • 打赏
  • 举报
回复
用参数拼接会有问题么?
sunzhong2003 2008-03-30
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 nosuchtracter 的回复:]
肯定有业务逻辑层了
但不喜欢拼语句
容易写错
[/Quote]
用通用的就可以了,自己再封装下代码,我就是这样,很好用
nosuchtracter 2008-03-28
  • 打赏
  • 举报
回复
肯定有业务逻辑层了
但不喜欢拼语句
容易写错
reborter 2008-03-27
  • 打赏
  • 举报
回复
mark
fanliang11 2008-03-27
  • 打赏
  • 举报
回复
如果有业务逻辑层..就放到业务层去拼接....你这个存储过程分页..做不到重用..哎..不实用
nosuchtracter 2008-03-27
  • 打赏
  • 举报
回复
各位遇到这种查询分页是怎么处理??
有没有好点的方法?
sunzhong2003 2008-03-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 my22xo 的回复:]
不能拼SQL语句指的是什么?

用参数的话应该不会存在安全方面问题吧
[/Quote]
所谓拼接,传参只是为了构造一条SQL语句,最终执行,存在SQL注入的漏洞,要做相应处理
nosuchtracter 2008-03-26
  • 打赏
  • 举报
回复
去掉rowcount会影响速度不
骑蚊子旅游 2008-03-26
  • 打赏
  • 举报
回复
不能拼SQL语句指的是什么?

用参数的话应该不会存在安全方面问题吧
sunzhong2003 2008-03-26
  • 打赏
  • 举报
回复
拼接就拼接吧,参数设值的时候,加个过滤
Go 旅城通票 2008-03-26
  • 打赏
  • 举报
回复
用游标不知道速度如何
反正也是从临时表中取数据
ppt_0322 2008-03-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sjt000 的回复:]
感觉你这样太麻烦了吧,不如用游标呢.
[/Quote]
很多时候是禁止游标的
sjt000 2008-03-26
  • 打赏
  • 举报
回复
感觉你这样太麻烦了吧,不如用游标呢.
ppt_0322 2008-03-26
  • 打赏
  • 举报
回复
限定条件后取得是10条可以的
SET ROWCOUNT 10
select * from tab where 1=1 and name=@name
purple_tide 2008-03-26
  • 打赏
  • 举报
回复
up一下 拼也没有什么大不了了 做好过滤就ok了
ppt_0322 2008-03-26
  • 打赏
  • 举报
回复
SET ROWCOUNT @pageUpperBound
取消这句获得的是全部的数据吧,该句是限定获得数据的条数。
nosuchtracter 2008-03-26
  • 打赏
  • 举报
回复
奇怪
没人??????????
今天什么日子?
nosuchtracter 2008-03-26
  • 打赏
  • 举报
回复
没人回?
自己顶下
SF

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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