下边的存储过程``出错了```不知怎样解决CREATE PROCEDURE testNew 
(@tint_tableid tinyint=1,      --这个是BBS的当前版面Id,你可以不用管他。。
@int_pagenow int=0,             
@int_pagesize int=0,
@int_recordcount int=0 output,   --就是得出BBS某个版面的总贴数。。
@xl varchar(200),
@order varchar(200)
)AS
set nocount ondeclare @int_allid int      
declare @int_beginid int,@int_endid int   
declare @int_pagebegin int, @int_pageend int
declare @sql1 varchar(400),@sql2 varchar(400)--select @int_allid=count(*) from tab_discuss where tint_level=0 and tint_tableid=@tint_tableid
set @sql1='select @int_allid=count(*) from Product where  ' +@xl
 exec (@sql1)
    select @int_recordcount=@int_allid         --得出该版面的总贴数 set @sql2='declare cro_fastread cursor  scroll 
for  select Pr_id from Product where '+@xl+' order by '+@order
   -- for   select Pr_id from Product where tint_level=0 and tint_tableid=@tint_tableid order by int_id desc  --这里定义游标操作,但是不用临时纪录集,而且游标也不需要全部遍历所有纪录集。
exec (@sql2)
    open cro_fastread  --打开游标
    select @int_beginid=(@int_pagenow-1)*@int_pagesize+1  --得出该页的第一个纪录Id
    select @int_endid = @int_beginid+@int_pagesize-1      --得出该页的最后一个纪录的Id
    
    fetch absolute  @int_beginid from cro_fastread into @int_pagebegin --将他的Id传给一个变量该页开始的Id
    if @int_endid>@int_allid        --这里要注意,如果某一页不足固定页数的纪录时。如只有一页纪录,而且纪录少于我们定义的数目。或者是最后一页时
        fetch last from cro_fastread into @int_pageend   --直接将游标绝对定位到最后一条纪录,得出他的id号来
    else
        fetch absolute @int_endid from cro_fastread into @int_pageend
                
    select pr_id,Pr_spec,pr_name,pr_picture,pr_price,pr_url,pr_brand,pr_sort2,pr_stoppro from Product where  Pr_id between @int_pageend and @int_pagebegin --order by int_rootid desc,num_order desc    
 --我们就可以利用该页的第一个id和最后一个id得出中间的id来。(注意。我们这个BBS的数性结构用了一种很巧妙的算法,就是用一个orderNum浮点数即可完成排序)--开始清场
    close cro_fastread          
    deallocate cro_fastread
    
    return
GO
===============================================在查询分析器中的报错是:
输入:
@xl="Pr_name like %15% ",@order="Pr_id desc"结果:服务器: 消息 16916,级别 16,状态 1,过程 testNew,行 29
名为 'cro_fastread' 的游标不存在。
服务器: 消息 16916,级别 16,状态 1,过程 testNew,行 33
名为 'cro_fastread' 的游标不存在。
服务器: 消息 16916,级别 16,状态 1,过程 testNew,行 37
名为 'cro_fastread' 的游标不存在。
服务器: 消息 137,级别 15,状态 1,行 1
必须声明变量 '@int_allid'。
服务器: 消息 170,级别 15,状态 1,行 2
第 2 行: '15' 附近有语法错误。
服务器: 消息 16916,级别 16,状态 1,过程 testNew,行 43
名为 'cro_fastread' 的游标不存在。
服务器: 消息 16916,级别 16,状态 1,过程 testNew,行 44
名为 'cro_fastread' 的游标不存在。

解决方案 »

  1.   

    --TOP n 实现的通用分页存储过程(转)CREATE PROC sp_PageView
    @tbname     sysname,            --要分页显示的表名
    @FieldKey   nvarchar(1000),   --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
    @PageCurrent int=1,            --要显示的页码
    @PageSize   int=10,             --每页的大小(记录数)
    @FieldShow nvarchar(1000)='',   --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
    @FieldOrder nvarchar(1000)='',   --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
                                              用于指定排序顺序
    @Where    nvarchar(1000)='',  --查询条件
    @PageCount 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(@Where,N'')=N''
    SET @Where=N''
    ELSE
    SET @Where=N'WHERE ('+@Where+N')'--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
    IF @PageCount IS NULL
    BEGIN
    DECLARE @sql nvarchar(4000)
    SET @sql=N'SELECT @PageCount=COUNT(*)'
    +N' FROM '+@tbname
    +N' '+@Where
    EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT
    SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
    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' '+@Where
    +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',
    @Where=REPLACE(@Where,@Field,N'a.'+@Field),
    @FieldOrder=REPLACE(@FieldOrder,@Field,N'a.'+@Field),
    @FieldShow=REPLACE(@FieldShow,@Field,N'a.'+@Field)
    SELECT @Where=REPLACE(@Where,@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 @Where='' THEN N'WHERE ('
    ELSE @Where+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 '+@Where
    +N' '+@FieldOrder
    +N')b ON '+@Where1
    +N' '+@Where2
    +N' '+@FieldOrder)
    END
      

  2.   

    输入错误:@xl="Pr_name like %15% ",@order="Pr_id desc"    --error
    @xl='Pr_name like ''%15%''',@order='Pr_id desc' --ok
      

  3.   

    计算总贴数错误:declare @sql1 nvarchar(400),@sql2 varchar(400)
    -- @sql1 varchar(400) --> @sql1 nvarchar(400)set @sql1='select @int_allid=count(*) from Product where ' +@xl
    --exec (@sql1)
    --select @int_recordcount=@int_allid --得出该版面的总贴数
    exec sp_executesql @sql1,N'@int_allid int output',@int_recordcount output
      

  4.   

    修改好``报错:服务器: 消息 214,级别 16,状态 2,过程 sp_executesql,行 25
    过程需要参数 '@statement' 为 'ntext/nchar/nvarchar' 类型。
    这个是什么原因``?>
      

  5.   

    计算总贴数错误:declare @sql1 nvarchar(400),@sql2 varchar(400)
    -- @sql1 varchar(400) --> @sql1 nvarchar(400)