通用存储过程怎样返回记录总数

susan0603 2007-10-24 03:50:44
存储过程代码:
ALTER PROCEDURE sp_Search

@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = '* ', -- 需要返回的列
@fldName varchar(255)= ' ', -- 排序的字段名
@PageSize int = 25, -- 页尺寸
@PageIndex int = 1, -- 页码
@doCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 1, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) = ' ' -- 查询条件 (注意: 不要加 where)

AS

declare @strSQL varchar(5000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型

if @doCount != 0
begin
if @strWhere != ' '
set @strSQL = 'select count(*) as Total from [ ' + @tblName + '] where '+@strWhere
else
set @strSQL = 'select count(*) as Total from [ ' + @tblName + '] '
end

else
begin
if @OrderType != 0
begin
set @strTmp = ' <(select min '
set @strOrder = ' order by [ ' + @fldName + '] desc '
end

else

begin
set @strTmp = ' >(select max '
set @strOrder = ' order by [ ' + @fldName + '] asc '
end

if @PageIndex = 1
begin
if @strWhere != ' '
set @strSQL = 'select top ' + str(@PageSize) + ' '+@strGetFields+ ' from [ ' + @tblName + '] where ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top ' + str(@PageSize) + ' '+@strGetFields+ ' from [ '+ @tblName + '] '+ @strOrder
end

else
begin
set @strSQL = 'select top ' + str(@PageSize) + ' '+@strGetFields+ ' from [ '
+ @tblName + '] where [ ' + @fldName + '] ' + @strTmp + '([ '+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [ '+ @fldName + '] from [ ' + @tblName + '] ' + @strOrder + ') as tblTmp) '+ @strOrder

if @strWhere != ' '
set @strSQL = 'select top ' + str(@PageSize) + ' '+@strGetFields+ ' from [ '
+ @tblName + '] where [ ' + @fldName + '] ' + @strTmp + '([ '
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [ '
+ @fldName + '] from [ ' + @tblName + '] where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
end

end

exec (@strSQL)

asp文件调用代码:
<p><% Dim CmdSP,rs
set CmdSP = Server.CreateObject("ADODB.Command")
CmdSP.ActiveConnection = cnn
CmdSP.CommandText = "sp_search"
CmdSP.CommandType = adCmdStoredProc
CmdSP.Prepared = true
Set rs = cnn.Execute("sp_Search 'v_datasheets', 'Part,Name', 'part',10," & request.querystring("p") & ",0,1,'brand=" & rs("ID") & "' ")
While Not rs.EOF
% <br><%=rs("name")%> <br>
<%rs1.MoveNext
Wend%></p>

现在要获取rs的记录总数进行分页,请教该怎样写呢。
...全文
201 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
susan0603 2007-10-29
  • 打赏
  • 举报
回复
没有帮!只有自己再顶一次了!
susan0603 2007-10-26
  • 打赏
  • 举报
回复
各位大侠请出手帮一下,搞了好几天了.
susan0603 2007-10-25
  • 打赏
  • 举报
回复
楼上说的是对的,用recordcount属性得到的值是-1
fcuandy 2007-10-24
  • 打赏
  • 举报
回复
ado中recordset的recordcount属性要看cursor属性. exec获得的记录记, recordcount值恒为-1
cxmcxm 2007-10-24
  • 打赏
  • 举报
回复
rs的recordcount属性即可得记录数
susan0603 2007-10-24
  • 打赏
  • 举报
回复
Set rs = cnn.Execute("sp_Search 'v_datasheets ', 'Part,Name ', 'part ',10," & request.querystring("p") & ",0,1, 'brand=" & rs("ID") & " ' ")
这样执行很正常,但如果改成这样:
Set rs = cnn.Execute("sp_Search 'v_datasheets ', 'Part,Name ', 'part ',10," & request.querystring("p") & ",1,1, 'brand=" & rs("ID") & " ' ")
执行时出错

ADODB.Recordset 错误 '800a0cc1'

在对应所需名称或序数的集合中,未找到项目。


samfeng_2003 2007-10-24
  • 打赏
  • 举报
回复
可以改成
EXEC DBO.sp_Search 'sysobjects', '* ', 'id ',20,1, 1,1, ' '
来测试一下
samfeng_2003 2007-10-24
  • 打赏
  • 举报
回复
ALTER PROCEDURE sp_Search

@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = '* ', -- 需要返回的列
@fldName varchar(255)= ' ', -- 排序的字段名
@PageSize int = 25, -- 页尺寸
@PageIndex int = 1, -- 页码
@doCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 1, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) = ' ' -- 查询条件 (注意: 不要加 where)

AS

declare @strSQL varchar(5000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型

if @doCount != 0
begin
if @strWhere != ' '
set @strSQL = 'select count(*) as Total from ['+@tblName+'] where '+@strWhere
else
set @strSQL = 'select count(*) as Total from ['+@tblName+'] '
end

else
begin
if @OrderType != 0
begin
set @strTmp = ' <(select min '
set @strOrder = ' order by [ ' + @fldName + '] desc '
end

else

begin
set @strTmp = ' >(select max '
set @strOrder = ' order by [ ' + @fldName + '] asc '
end

if @PageIndex = 1
begin
if @strWhere != ' '
set @strSQL = 'select top ' + str(@PageSize) + ' '+@strGetFields+ ' from [ ' + @tblName + '] where ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top ' + str(@PageSize) + ' '+@strGetFields+ ' from [ '+ @tblName + '] '+ @strOrder
end

else
begin
set @strSQL = 'select top ' + str(@PageSize) + ' '+@strGetFields+ ' from [ '
+ @tblName + '] where [ ' + @fldName + '] ' + @strTmp + '([ '+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [ '+ @fldName + '] from [ ' + @tblName + '] ' + @strOrder + ') as tblTmp) '+ @strOrder

if @strWhere != ' '
set @strSQL = 'select top ' + str(@PageSize) + ' '+@strGetFields+ ' from [ '
+ @tblName + '] where [ ' + @fldName + '] ' + @strTmp + '([ '
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [ '
+ @fldName + '] from [ ' + @tblName + '] where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
end

end

EXEC (@strSQL)
GO




EXEC DBO.sp_Search 'TestTwo','*','id',20,1, 1,1,''

DROP PROC sp_Search

Total
-----------
310



在这里的时候,这里以前在['+@tblName+']周围的空格引起了错误,要仔细检查一下!用是可以用的
if @strWhere != ' '
set @strSQL = 'select count(*) as Total from ['+@tblName+'] where '+@strWhere
else
set @strSQL = 'select count(*) as Total from ['+@tblName+'] '
fcuandy 2007-10-24
  • 打赏
  • 举报
回复
那很明显只执行了
EXEC('SELECT TOP x filedslist FROM ... ')
而不是执行
EXEC('SELECT COUNT(*) FROM .... ; SELECT TOP x fieldslist FROM ...')

检查 @doCount 的参数值, 使存储过程执行 SELECT COUNT(*) ... 和 SELECT TOP x Fieldslist From ..
两个操作

set rs=cmdsp.execute(....)
response.write(rs(0))
即可得到count值

然后再用 rs.nextrecordset 方法得到 select top 所产生的行集.
susan0603 2007-10-24
  • 打赏
  • 举报
回复
对,
<%=rs(0)% >输出是strFields中指定的第一列行一行的值
fcuandy 2007-10-24
  • 打赏
  • 举报
回复
这个存储过程写的很乱, 不想理结构.你直接 <%=rs(0)%>看下输出是什么.估计是strFields中指定的第一列行一行的值.
susan0603 2007-10-24
  • 打赏
  • 举报
回复
我问的是 samfeng_2003凤翼天翔 说的那个意思
@doCount bit = 0, -- 返回记录总数, 非 0 值则返回 我把这里改为1了,但<%=rs("Total")% >这样取不到记录总数提示:列名 'Total' 无效。
fcuandy 2007-10-24
  • 打赏
  • 举报
回复
如果 count值是以输出参数或返回值表现的,那么获得存储过程参数即可.
如果 count值是以行集呈现的,那么用 ado.recordset.nextrecordset方法获取即可.
比如
create proc mysp
as
select * from tb
select @@rowcount



set rs=conn.execute("mysp")
dim rs1:set rs1=server.createobject("adodb.recordset")
set rs1=rs.nextrecordset

fcuandy 2007-10-24
  • 打赏
  • 举报
回复
使用@@ROWCOUNT全局函数
或者select count(*) ..
如果在动态语句中
可以在外部用@@ROWCOUNT获得
也可以, 在exec语句内部用变量获得count数,可以是用@@ROWCOUNT,也可以是select count,然后用sp_executesql取得
samfeng_2003 2007-10-24
  • 打赏
  • 举报
回复
@doCount bit = 0, -- 返回记录总数, 非 0 值则返回 这里写的比较清楚了啊!

如果把这个参数设置为非0的数字的话,那么就返回的是记录总数.
if @doCount != 0
begin
if @strWhere != ' '
set @strSQL = 'select count(*) as Total from [ ' + @tblName + '] where '+@strWhere
else
set @strSQL = 'select count(*) as Total from [ ' + @tblName + '] '
end

这里<%=rs("Total")% >就可以了啊!
pt1314917 2007-10-24
  • 打赏
  • 举报
回复
在exec (@strSQL)后面加上select @@ROWCOUNT 就可以得到返回行数了`
dawugui 2007-10-24
  • 打赏
  • 举报
回复
select count(*) from (子查询) t

--或

select @@ROWCOUNT

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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