存储过程如下:GO
/****** 对象:  StoredProcedure [dbo].[sp_PageView]    脚本日期: 11/21/2009 08:31:07 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create PROC [dbo].[sp_PageView]
 @tbname     sysname,               --要分页显示的表名
 @FieldKey   nvarchar(1000),      --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
 @PageCurrent int=1,               --要显示的页码
 @PageSize   int=10,                --每页的大小(记录数)
 @FieldShow nvarchar(1000)='',      --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
 @FieldOrder nvarchar(1000)='',      --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC,用于指定排序顺序
 @Where    nvarchar(1000)='',     --查询条件
 @ItemCount int OUTPUT,
 @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赋值)
 
     DECLARE @sql nvarchar(4000)
     SET @sql=N'SELECT @ItemCount=COUNT(*)'
         +N' FROM '+@tbname
         +N' '+@Where
     EXEC sp_executesql @sql,N'@ItemCount int OUTPUT',@ItemCount OUTPUT
     SET @PageCount=(@ItemCount+@PageSize-1)/@PageSize
 
 print @PageCount
 print @ItemCount
 --计算分页显示的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')'
    DECLARE @QUERYSTRING varchar(2000)
    SET @QUERYSTRING =     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
   -- PRINT @QUERYSTRING    
    --执行查询
    EXEC(@QUERYSTRING)
END我现在有一个数据表,表名是tb_sys_employee,请问我该怎么个调用?谁能示例下

解决方案 »

  1.   

    EXEC [dbo].[sp_PageView] 参数1,参数2,.....
      

  2.   

    G. 使用带 DEFAULT 的 EXECUTE 语句
    这个例子创建了一个存储过程,过程中第一个和第三个参数为默认值。当运行该过程时,如果调用时没有传递值或者指定了默认值,这些默认值就会赋给第一个和第三个参数。注意 DEFAULT 关键字有多种使用方法。 USE pubs
    IF EXISTS (SELECT name FROM sysobjects 
          WHERE name = 'proc_calculate_taxes' AND type = 'P')
       DROP PROCEDURE proc_calculate_taxes
    GO
    -- Create the stored procedure.
    CREATE PROCEDURE proc_calculate_taxes (@p1 smallint = 42, @p2 char(1), 
          @p3 varchar(8) = 'CAR')
        AS 
       SELECT * 
       FROM mytableproc_calculate_taxes 存储过程可以以多种组合方式执行: EXECUTE proc_calculate_taxes @p2 = 'A'
    EXECUTE proc_calculate_taxes 69, 'B'
    EXECUTE proc_calculate_taxes 69, 'C', 'House'
    EXECUTE proc_calculate_taxes @p1 = DEFAULT, @p2 = 'D'
    EXECUTE proc_calculate_taxes DEFAULT, @p3 = 'Local', @p2 = 'E'
    EXECUTE proc_calculate_taxes 69, 'F', @p3 = DEFAULT
    EXECUTE proc_calculate_taxes 95, 'G', DEFAULT
    EXECUTE proc_calculate_taxes DEFAULT, 'H', DEFAULT
    EXECUTE proc_calculate_taxes DEFAULT, 'I', @p3 = DEFAULT
      

  3.   

    exec  [dbo].[sp_PageView]  
      

  4.   

    请问该怎么写?我是这样写的
    declare @itemcount int
    declare @pagecount int
    exec sp_pageview @tbname='tb_sys_employee',
    @fieldkey='id',
    @pagecurrent=1,
    @pagesize=4,
    @fieldshow='*',
    @fieldorder='id asc',
    @where='',
    @itemcount output,
    @pagecount output
    运行用后报错信息是
    消息 119,级别 15,状态 1,第 3 行
    必须传递参数 8,并以 '@name = value' 的形式传递后续的参数。一旦使用了 '@name = value' 形式之后,所有后续的参数就必须以 '@name = value' 的形式传递。谁能帮我修正下上面的错误
      

  5.   

    这一个实现分页查询的存储过程,我SQL没怎么学,现在拿到这存储过程我不知道怎么个用法