CREATE PROC sp_FKPager
    @sField        varchar(1024), --显示字段
    @sTableName    varchar(1024), --读取表名
    @sFKTableName  varchar(1024),       --关系表名
    @sWhere        varchar(1024), --查询条件
    @sOrderby      varchar(1024), --排序规则,一定要DESC或ASC
    @sID           varchar(1024), --表主键,以此为计算行数
    @PageSize      int, --每页显示数
    @PageNo        int --页码
ASSET NOCOUNT ON
DECLARE @sSQL nvarchar(4000), @tmpIndex int, @P int
SET @sSQL   =   ''
SET @tmpIndex   =   -1IF @PageNo < 1
    SET @PageNo = 1
IF @PageSize < 1
    SET @PageSize = 10--总记录数
SET @sSQL   =   'SELECT COUNT(' + @sID + ') AS RecordSet FROM ' + @sTableName
IF @sWhere <> ''
    SET @sSQL   =   @sSQL + ' WHERE ' + @sWhere
--print @sSQL
EXEC(@sSQL)IF @PageNo = 1
    BEGIN
        SET ROWCOUNT @PageSize
        SET @sSQL   =   'SELECT ' + @sField + ' FROM ' + @sFKTableName
        IF @sWhere <> ''
            SET @sSQL   =   @sSQL + ' WHERE ' + @sWhere
        IF @sOrderby <> ''
            SET @sSQL   =   @sSQL + ' ORDER BY ' + @sOrderby
        --print @sSQL
        EXEC(@sSQL)
        RETURN
    END--不是第一页
SET @P = (@PageNO - 1) * @PageSize
SET ROWCOUNT @PSET @sSQL   =   'SELECT @Index = ' + @sID + ' FROM ' + @sTableName
IF @sWhere <> ''
    SET @sSQL   =   @sSQL + ' WHERE ' + @sWhere
IF @sOrderby <> ''
    SET @sSQL   =   @sSQL + ' ORDER BY ' + @sOrderbyEXECUTE sp_executesql @sSQL, N'@Index int OUT', @Index = @tmpIndex OUTPUT 这句话什么意思呀????
--print @tmpIndexSET @sSQL = 'SELECT ' + @sField + ' FROM ' + @sFKTableName
IF @sWhere = ''
    BEGIN
        IF CHARINDEX('DESC', @sOrderby) <> 0
            SET @sSQL   =   @sSQL + ' WHERE ' + @sID + ' < ' + Convert(Nvarchar(50), @tmpIndex)
        ELSE
            SET @sSQL   =   @sSQL + ' WHERE ' + @sID + ' > ' + Convert(Nvarchar(50), @tmpIndex)
    END
ELSE
    BEGIN
        IF CHARINDEX('DESC', @sOrderby) <> 0
            SET @sSQL   =   @sSQL + ' WHERE ' + @sID + ' < ' + Convert(Nvarchar(50), @tmpIndex) + ' AND (' + @sWhere + ')'
        ELSE
            SET @sSQL   =   @sSQL + ' WHERE ' + @sID + ' > ' + Convert(Nvarchar(50), @tmpIndex) + ' AND (' + @sWhere + ')'
    ENDIF @sOrderby <> ''
    SET @sSQL   =   @sSQL + ' ORDER BY ' + @sOrderby
--print @sSQL
SET ROWCOUNT @PageSize
EXEC(@sSQL)
SET NOCOUNT OFF
GO

解决方案 »

  1.   

    就是把@sSQL   =   'SELECT @Index = ' + @sID + ' FROM ' + @sTableName动态语句的结果赋给@tmpIndex变量sp_executesql的用法可以参考联机帮助,表达能力不行,给你个例子参考一下
    create table a(id int)
    insert into a select 1
    godeclare @tbname nvarchar(10)
    set @tbname='a'
    declare @sql nvarchar(4000)
    declare @count int
    declare @t int
    set @sql=N'select @count=count(*) from ['+@tbname+']'
    exec sp_executesql @sql,N'@count int output',@count=@t output
    select @tdrop table a