邹老大你好,我买了你一本sqlserver2000的循序渐进的书,在里面学会了分页,但是我在把存储过程的结果集新建一张表的时候,报错。具体语句如下:
select * from openrowset('SQLOLEDB',
'SERVER=.;uid=sa;pwd=sa;Database=yjjflowtemps',
'
exec  sp_PgaeView xsb,id')
服务器: 消息 170,级别 15,状态 1,行 1
第 5 行: ')' 附近有语法错误。其中sp_PgaeView 是分页的存储过程。其内容如下
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_PgaeView]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[sp_PgaeView]
GOSET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO
--使用临时表进行分页
CREATE    proc dbo.sp_PgaeView
@tbname sysname, --要分页显示的表名
@FieldKey sysname, --用于定位记录的主键(唯一键)字段,只能是单个字段
@PageCurrent int=1, --要显示的页码
@PageSize int =1000, --每页的大小(记录数)
@FieldShow nvarchar(1000)=N'', --以逗号分隔的要显示的字段列表,若不指定,则显示所有字段
@FieldOrder nvarchar(1000)=N'ID ASC',--以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC用于指定排序顺序
@where nvarchar(1000)=N''--,--查询条件
--@PageCount int --output --总页数
as
set nocount on
declare @sql nvarchar(4000),@PageCount int;
--检查对象是否有效
if object_id(@tbname) is null
begin
raiserror(N'对象"%s"不存在',16,1,@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"不是表、视图或者表值函数',16,1,@tbname); --定制用户自定义错误
return;
end;---分页字段检查
if isnull(@FieldKey,N'')=''
begin
raiserror(N'分页处理需要主键(或者唯一键)',16,16); --定制用户自定义错误
return;
end;--其他参数检查及规范
if isnull(@PageCurrent,0)<1
set @PageCurrent=1;if isnull(@PageSize,0)<1
set @PageSize=1000;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
--取记录数
set @sql=N'
SELECT 
     @PageCount=COUNT(*)
FROM '+@tbname+N'
'+@whereexec sp_executesql
     @sql,
     N'@PageCount int output',
     @PageCount output
--根据记录数计算页数
set @PageCount=(@PageCount+@PageSize-1)/@PageSize
end--第一页直接显示
if @PageCurrent=1
begin
set ROWCOUNT @PageSize
exec(N'
SELECT
'+@FieldShow+N'
FROM '+@tbname+N'
'+@where+N'
'+@FieldOrder
)
set rowcount 0
end
else
begin
declare
          @Rows_Start varchar(20),
      @Rows_Stop varchar(20),
      @WhereJoin nvarchar(4000),
      @FieldKeys nvarchar(1000),
      @FieldKeyName sysname
select
@Rows_Stop=@PageSize*@PageCurrent, --要查询的页最后一条记录所在记录的记录数
@Rows_Start=@Rows_Stop-@PageSize, --要查询的页的前一页最后一条记录所在记录的记录数
@WhereJoin=N'',
@FieldKeys=@FieldKey+N',' --生成主键(唯一键)过滤条件
WHILE @FieldKeys>N''
      SELECT
      @FieldKeyName=LTRIM(RTRIM(LEFT(@FieldKeys,CHARINDEX(N',',@FieldKeys)-1))), 
      @FieldKeys=stuff(@FieldKeys,1,CHARINDEX(N',',@FieldKeys),N''),
      @WhereJoin=@WhereJoin+N' AND A.'+@FieldKeyName+N' = B.'+@FieldKeyName
set @WhereJoin=stuff(@WhereJoin,1,5,N'') --查询
exec(N'
--生成主键数据到临时表
set rowcount '+@Rows_Stop+N'
SELECT '+@FieldKey+N'
INTO #
FROM '+@tbname+N'
'+@where +N'
'+@FieldOrder+N'--从临时表中删除当前页之前的页主键记录
set rowcount '+@Rows_Start+N'
delete from #
set rowcount 0--关联临时表以获取查询结果
select 
'+@FieldShow +N'
FROM '+@tbname +N' A
WHERE EXISTS(
SELECT * FROM # B
WHERE '+@WhereJoin+N'
)
'+@FieldOrder
)
end
GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO请问具体是什么原因呢?

解决方案 »

  1.   

    http://blog.csdn.net/happyflystone/archive/2008/08/01/2752936.aspx
      

  2.   

    ------------------------------------ 
    -- Author:Flystone  
    -- Version:V1.001   
    -- Date:2008-08-01 12:39:33 
    ------------------------------------ -- Test Data: ta 
    If object_id('ta') is not null  
        Drop table ta 
    Go 
    Create table ta(bno int,bname nvarchar(5),editor nvarchar(5),bpub nvarchar(7),bdate numeric(5,1)) 
    Go 
    Insert into ta 
    select 1,'数据库原理','wang','gaojiao',2006.9 union all 
    select 2,'信息系统','liu','kexue',2006.8 union all 
    select 3,'数据库实例','wang','gaojiao',2006.9 union all 
    select 4,'数据库习题','zhang','jixie',2005.4  
    Go --create proc 
    create proc proc_a 
    @bno int 
    as 
    select * from ta where bno <= @bno 
    go 
    --Start 
    select *  
    from OPENROWSET('SQLOLEDB','SERVER=.;UID=sa;PWD=','exec csdn_test.dbo.proc_a  2') AS a 
    select *  
    from OPENROWSET('SQLOLEDB','.';'sa';'','exec csdn_test.dbo.proc_a  2') AS a select *  
    from OPENROWSET('SQLOLEDB','DRIVER={SQL Server};SERVER=.;UID=sa;PWD=','exec csdn_test.dbo.proc_a  2') AS a --Drop proc 
    drop proc proc_a --Result: /* 
    bno         bname                                              editor       bpub         bdate    
    ----------- -------------------------------------------------- ------------ ------------ -------  
    1           数据库原理                                              wang         gaojiao      2006.9 
    2           信息系统                                               liu          kexue        2006.8 (所影响的行数为 2 行) 
    bno         bname                                              editor       bpub         bdate    
    ----------- -------------------------------------------------- ------------ ------------ -------  
    1           数据库原理                                              wang         gaojiao      2006.9 
    2           信息系统                                               liu          kexue        2006.8 (所影响的行数为 2 行) 
    bno         bname                                              editor       bpub         bdate    
    ----------- -------------------------------------------------- ------------ ------------ -------  
    1           数据库原理                                              wang         gaojiao      2006.9 
    2           信息系统                                               liu          kexue        2006.8 (所影响的行数为 2 行) 
    */ 
    --END
      

  3.   

    Try:select * from openrowset('SQLOLEDB', 
    'SERVER=.;uid=sa;pwd=sa;Database=yjjflowtemps', 
    'exec  sp_PgaeView ''xsb'',''id''') AS T
      

  4.   


    select * from openrowset('SQLOLEDB', 
    'SERVER=.;uid=sa;pwd=sa;Database=yjjflowtemps', 
    'exec  tt1 ''xsb'',''id''') 
      

  5.   


    select * from openrowset('SQLOLEDB', 
    'SERVER=.;uid=sa;pwd=sa;Database=yjjflowtemps', 
    'exec  sp_PgaeView ''xsb'',''id''') 把示例的存储过程名弄错了
      

  6.   

    SQL code
    select * from openrowset('SQLOLEDB', 
    'SERVER=.;uid=sa;pwd=sa;Database=yjjflowtemps', 
    'exec  sp_PgaeView ''xsb'',''id''') 
    中的exec sp_PageView xsb,id你可以看看存储过程具体数据类型,它可以不用引号的
    select * from openrowset('SQLOLEDB', 
    'SERVER=.;uid=sa;pwd=sa;Database=yjjflowtemps', 
    'exec  sp_PgaeView ''xsb'',''id''')  as a
    这样还是不行。请大家请教。
    sp_PageView这个存储过程是邹老大写的。我是借来用用,但是就是不行,请你们帮忙测试下!!谢谢
      

  7.   

    OPENROWSET('SQLOLEDB','DRIVER={SQL Server};SERVER=.;UID=sa;PWD=sa','exec yjjflowtemps.dbo.sp_PgaeView ''xsb'',''id''') AS a