首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

急一个存储过程做分页是的有关问题`帮忙看看`

2012-03-13 
急急急`一个存储过程做分页是的问题``帮忙看看```下边的存储过程``出错了```不知怎样解决CREATEPROCEDUREt

急急急`一个存储过程做分页是的问题``帮忙看看```
下边的存储过程``出错了```不知怎样解决

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   on

declare   @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 '   的游标不存在。



[解决办法]
--相同帖?

--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


热点排行
Bad Request.