一个简单的分页存储过程问题

qiezicc 2006-11-01 09:22:49
下面代码是自己写的,请勿见笑

CREATE PROCEDURE show_swf
@current bigint,
@count int output
AS
declare @minid bigint
declare @sqls nvarchar(1000)
set @sqls='select @minid=min(id) from swf where id in(select top '+@current*20+' id from swf order by id desc)'
exec sp_executesql @sqls,N'@minid bigint output' --我想从这里返回最小ID,但老报“将数据类型 varchar 转换为 bigint 时出错”,为什么?
select top 20 [id],[name],intro,image,path from swf where id not in (select id from swf where id>=@minid ) order by id desc
select @count=count(*) from swf
GO
...全文
215 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiezic 2006-11-01
  • 打赏
  • 举报
回复
不想用别人的,帮忙改改我的代码就可以,拜托
gavintolee 2006-11-01
  • 打赏
  • 举报
回复
从网上找来修改后的:(加上了返回总记录数和总页数)
--------------------------------------用途:分页存储过程(对有主键的表效率极高) ------------------------------------
CREATE PROCEDURE pro_GetRecordByPage
@TableName VARCHAR(255), -- 表名
@KFieldName VARCHAR(255), -- 主键字段名
@FieldName VARCHAR(1000)='*', --需要返回的列
@PageSize INT =10, -- 页尺寸
@PageIndex INT=1 , -- 页码
@OrderType BIT =0, -- 设置排序类型, 非 0 值则降序
@StrWhere VARCHAR(1000)='' , -- 查询条件 (注意: 不要加 where)
@TotalRecord INT OUT, --返回总记录数
@TotalPage INT OUT --返回总页数
AS
DECLARE @StrSQL VARCHAR(6000) -- 主语句
DECLARE @StrTmp VARCHAR(100) -- 临时变量
DECLARE @StrOrder VARCHAR(400) -- 排序类型
DECLARE @SQL NVARCHAR(1000) --统计语句
IF @StrWhere = ''
BEGIN
SET @SQL = 'SELECT @TotalRecord=COUNT(*) FROM [' + @TableName + ']'
END
ELSE
BEGIN
SET @SQL = 'SELECT @TotalRecord=COUNT(*) FROM [' + @TableName + ']' + ' WHERE ' + @StrWhere
END
EXEC SP_EXECUTESQL @SQL, N'@TotalRecord INT OUTPUT',@TotalRecord OUTPUT --计算总记录数
SET @TotalPage =CEILING( CAST(@TotalRecord AS FLOAT)/CAST(@PageSize AS FLOAT) )--计算总页数
--判断排序类型
IF @OrderType != 0
BEGIN
SET @StrTmp = '<(SELECT MIN'
SET @StrOrder = ' ORDER BY [' + @KFieldName +'] DESC'
END
ELSE
BEGIN
SET @StrTmp = '>(SELECT MAX'
SET @StrOrder = ' ORDER BY [' + @KFieldName +'] ASC'
END
SET @StrSQL = 'SELECT TOP ' + str(@PageSize) +' '+@FieldName+ ' FROM ['
+ @TableName + '] WHERE [' + @KFieldName + ']' + @StrTmp + '(['
+ @KFieldName + ']) FROM (SELECT TOP ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @KFieldName + '] FROM [' + @TableName + ']' + @StrOrder + ') AS tblTmp)'
+ @StrOrder
--判断是否有条件
IF @StrWhere != ''
SET @StrSQL = 'SELECT TOP ' + str(@PageSize) +' '+@FieldName+ ' FROM ['
+ @TableName + '] WHERE [' + @KFieldName + ']' + @StrTmp + '(['
+ @KFieldName + ']) FROM (SELECT TOP ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @KFieldName + '] FROM [' + @TableName + '] WHERE ' + @StrWhere + ' '
+ @StrOrder + ') AS tblTmp) AND ' + @StrWhere + ' ' + @StrOrder
IF @PageIndex = 1
BEGIN
SET @StrTmp =''
IF @StrWhere != ''
SET @StrTmp = ' WHERE ' + @StrWhere
SET @StrSQL = 'SELECT TOP ' + str(@PageSize) +' '+ @FieldName+ ' FROM ['
+ @TableName + ']' + @StrTmp + ' ' + @StrOrder
END
EXEC (@StrSQL)

GO
江城老温 2006-11-01
  • 打赏
  • 举报
回复
我记得秋枫和思寓的blog里都有分页的文章。
qiezicc 2006-11-01
  • 打赏
  • 举报
回复
还是不会,帮我帖出完整的代码吧,谢谢
id字段也是bigint类型,跟@minid类型一样,为什么要强制转化?
leaohong 2006-11-01
  • 打赏
  • 举报
回复
在sp_executesql中把取的那个值强制转换,@minid=CONVERT(bigint, XXX)
qiezicc 2006-11-01
  • 打赏
  • 举报
回复
不懂得改,楼上的帮帮忙
leaohong 2006-11-01
  • 打赏
  • 举报
回复
用CONVERT强制转换,类型不同当然不能输出啦
qiezicc 2006-11-01
  • 打赏
  • 举报
回复
哈哈,因为我是用C#调的,所以跟C#扯的上关系
qiezicc 2006-11-01
  • 打赏
  • 举报
回复
SQL SERVER,那里不对?
lovvver 2006-11-01
  • 打赏
  • 举报
回复
搂主,这里好象不是sql server版吧
怎么都喜欢到c#来问sqlserver的问题

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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