在网上找的一个分页的存储过程如下:
CREATE   PROCEDURE   [dbo].[sp_page]   
    @strTable       varchar(50),   --表名   
    @strColumn      varchar(50),   --按该列来进行分页   
    @intColType     int,           --@strColumn列的类型,0-数字类型,1-字符类型,2-日期时间类型   
    @intOrder       bit,           --排序,0-顺序,1-倒序   
    @strColumnlist varchar(800), --要查询出的字段列表,*表示全部字段   
    @intPageSize    int,           --每页记录数   
    @intPageNum     int,           --指定页   
    @strWhere       varchar(800), --查询条件   
    @intPageCount   int   OUTPUT   --总页数   
 AS   
  DECLARE   @sql    nvarchar(4000) --用于构造SQL语句
 DECLARE   @where1 varchar(800)   --构造条件语句
 DECLARE   @where2 varchar(800)   --构造条件语句
 IF   @strWhere   is   null   or   rtrim(@strWhere)=''   
 -- 为了避免SQL关键字与字段、表名等连在一起,首先为传入的变量添加空格
 BEGIN  --没有查询条件   
      SET   @where1=' WHERE '   
      SET   @where2=' '   
 END   
 ELSE   
 BEGIN  --有查询条件   
      SET   @where1=' WHERE ('+@strWhere+') AND ' 
      SET   @where2=' WHERE ('+@strWhere+') '   
 END   
  set @strColumn = ' ' + @strColumn + ' '
 set @strColumnlist = ' ' + @strColumnlist + ' '
 --构造SQL语句,计算总页数。计算公式为 总页数 = Ceiling ( 记录个数 / 页大小 ) http://www.knowsky.com
 SET   @sql='SELECT   @intPageCount=CEILING((COUNT(*)+0.0)/'
        + CAST(@intPageSize   AS   varchar)
        + ')   FROM   ' + @strTable + @where2   
 --执行SQL语句,计算总页数,并将其放入@intPageCount变量中
 EXEC sp_executesql @sql,N'@intPageCount   int   OUTPUT',@intPageCount   OUTPUT 
 --将总页数放到查询返回记录集的第一个字段前,此语句可省略
 SET  @strColumnlist= Cast(@intPageCount as varchar(30)) + ' as PageCount,' + @strColumnlist   
 IF   @intOrder=0   --构造升序的SQL
      SET @sql='SELECT TOP '+ CAST(@intPageSize   AS   varchar) + 
               @strColumnlist +   
               ' FROM ' + @strTable + @where1 + 
               @strColumn + '>(SELECT MAX('+@strColumn+') '+   
               ' FROM (SELECT TOP '+ CAST(@intPageSize*(@intPageNum - 1) AS  varchar) +   
               @strColumn + ' FROM '+ @strTable+@where2+'ORDER BY '+@strColumn+') t) ORDER BY '+ @strColumn   
 ELSE              --构造降序的SQL   
      SET @sql='SELECT TOP '+ CAST(@intPageSize   AS   varchar) + 
               @strColumnlist+   
               ' FROM '+ @strTable + @where1 + 
               @strColumn + '<(SELECT   MIN('+@strColumn+')   '+   
               ' FROM (SELECT TOP '+ CAST(@intPageSize*(@intPageNum - 1) AS  varchar) +   
               @strColumn + ' FROM '+ @strTable+@where2+'ORDER   BY '+@strColumn+'   DESC)   t)   ORDER   BY   '+   
               @strColumn + ' DESC'        
 IF   @intPageNum=1--第一页   
      SET   @sql='SELECT   TOP   '+CAST(@intPageSize   AS   varchar) + @strColumnlist + ' FROM '+@strTable+   
                 @where2+'ORDER   BY   '+@strColumn+CASE   @intOrder WHEN  0 THEN  '' ELSE  ' DESC' 
 END   
 --PRINT   @sql   
 EXEC(@sql)   
在SQL Server 2005上也执行成功了。我在查询分析器中是如下进行调用的:DECLARE @RC int
DECLARE @strTable varchar(50)
DECLARE @strColumn varchar(50)
DECLARE @intColType int
DECLARE @intOrder bit
DECLARE @strColumnlist varchar(800)
DECLARE @intPageSize int
DECLARE @intPageNum int
DECLARE @strWhere varchar(800)
DECLARE @intPageCount int-- TODO: 在此处设置参数值。EXECUTE @RC = [YHong_2006].[dbo].[sp_page] 
   @strTable='dbo.myUser'
  ,@strColumn='UserId'
  ,@intColType=0
  ,@intOrder=0
  ,@strColumnlist='*'
  ,@intPageSize=15
  ,@intPageNum=1
  ,@strWhere=''
  ,@intPageCount OUTPUT;
但是出现如下错误:
消息 119,级别 15,状态 1,第 14 行
必须传递参数 9,并以 '@name = value' 的形式传递后续的参数。一旦使用了 '@name = value' 形式之后,所有后续的参数就必须以 '@name = value' 的形式传递。请高手指点,谢谢!

解决方案 »

  1.   

     ,@intPageCount OUTPUT;
    ============
    ,@intPageCount = OUTPUT;
      

  2.   

    ALTER PROCEDURE  [dbo].[proc_name]
    (
    @a varchar(10),
    @b varchar(10)output
    )
    as
    select @b=username from a
    where username=@a-----调用
    DECLARE @S VARCHAR(50)
    DECLARE @A VARCHAR(50)EXEC [dbo].[proc_name] 'AA',@S OUTPUT
    SELECT @S
    --------------------------------------------------
    aa(1 row(s) affected)
      

  3.   

    EXECUTE @RC = [YHong_2006].[dbo].[sp_page] 'dbo.myUser'
      ,'UserId'
      ,0
      ,0
      ,'*'
      ,15
      ,1
      ,''
      ,@intPageCount OUTPUT;
      

  4.   

    EXECUTE @RC = [YHong_2006].[dbo].[sp_page] 
       @strTable='dbo.myUser'
      ,@strColumn='UserId'
      ,@intColType=0
      ,@intOrder=0
      ,@strColumnlist='*'
      ,@intPageSize=15
      ,@intPageNum=1
      ,@strWhere=''
      ,@intPageCount = @intPageCount OUTPUT;