日期:2014-05-18  浏览次数:20493 次

【小问题】关于利用俄罗斯存储过程进行数据分页
存储过程如下:
SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO



ALTER PROC GetPage 
@PageSize int, --每页记录数
@PageIndex int, -- 当前返回页(从1起)
@TableName varchar(50), --数据表名称 
@RowFiler varchar(500), --查询字句,WHERE后面的部分
@SortExp varchar(500) --排序字句,ORDER BY后面的部分 
AS 
SET NOCOUNT ON 
BEGIN 
  DECLARE @IndexTable TABLE(id int IDENTITY(1,1),nid int) --表变量
  DECLARE @PageLowerBound int --当前页最前记录
  DECLARE @PageUpperBound int --当前页最末记录

  SET @PageLowerBound = (@PageIndex - 1) * @PageSize 
  SET @PageUpperBound = @PageLowerBound + @PageSize  

  SET ROWCOUNT @PageUpperBound

  EXEC ('INSERT INTO @IndexTable(nid) SELECT ID FROM ' + @TableName + ' WHERE ' + @RowFiler + ' ORDER BY ' + @SortExp) 
  EXEC ('SELECT O.* FROM ' + @TableName + ' O,@IndexTable t WHERE O.ID = t.nid AND t.id > @PageLowerBound AND t.id <= @PageUpperBound ORDER BY t.id') 
END 
SET NOCOUNT OFF 



GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

运行时报以下错误

服务器: 消息 137,级别 15,状态 2,行 1
必须声明变量 '@IndexTable'。
服务器: 消息 137,级别 15,状态 1,行 1
必须声明变量 '@IndexTable'。
存储过程: HangBiao.dbo.GetPage
返回代码 = 0

请各位帮忙看看,谢谢

------解决方案--------------------
SET QUOTED_IDENTIFIER ON
GO 
SET ANSI_NULLS ON
GO 


ALTER PROC GetPage
@PageSize int, --每页记录数 
@PageIndex int, -- 当前返回页(从1起) 
@TableName varchar(50), --数据表名称
@RowFiler varchar(500), --查询字句,WHERE后面的部分 
@SortExp varchar(500) --排序字句,ORDER BY后面的部分
AS
SET NOCOUNT ON
BEGIN
--DECLARE @IndexTable TABLE(id int IDENTITY(1,1),nid int) --表变量 
DECLARE @PageLowerBound int --当前页最前记录 
DECLARE @PageUpperBound int --当前页最末记录 

SET @PageLowerBound = (@PageIndex - 1) * @PageSize
SET @PageUpperBound = @PageLowerBound + @PageSize

SET ROWCOUNT @PageUpperBound 
EXEC('DECLARE @IndexTable TABLE(id int IDENTITY(1,1),nid int)
INSERT INTO @IndexTable(nid) SELECT ID FROM ' + @TableName + ' WHERE ' + @RowFiler + ' ORDER BY ' + @SortExp)
SELECT O.* FROM ' + @TableName + ' O,@IndexTable t WHERE O.ID = t.nid AND t.id > @PageLowerBound AND t.id <= @PageUpperBound ORDER BY t.id ')
END
SET NOCOUNT OFF


GO 
SET QUOTED_IDENTIFIER OFF
GO 
SET ANSI_NULLS ON
GO
 
------解决方案--------------------
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO


ALTER PROC GetPage
@PageSize int, --每页记录数
@PageIndex int, -- 当前返回页(从1起)
@TableName varchar(50), --数据表名称
@RowFiler varchar(500), --查询字句,WHERE后面的部分
@SortExp varchar(500) --排序字句,ORDER BY后面的部分
AS
SET NOCOUNT ON
BEGIN
--DECLARE @IndexTable TABLE(id int IDENTITY(1,1),nid int) --表变量
DECLARE @PageLowerBound int --当前页最前记录
DECLARE @PageUpperBound int --当前页最末记录

SET @PageLowerBound = (@PageIndex - 1) * @PageSize
SET @PageUpperBound = @PageLowerBound + @PageSize

SET ROWCOUNT @PageUpperBound
EXEC( 'DECLARE @IndexTable TABLE(id int IDENTITY(1,1),nid int) 
INSERT INTO @IndexTable(nid) SELECT ID FROM ' + @TableName + ' WHERE ' + @RowFiler + ' ORDER BY ' + @SortExp +'
SELECT O.* FROM ' + @TableName + ' O,@IndexTable t WHERE O.ID = t.nid AND t.id > @PageLowerBound AND t.id <= @PageUpperBound ORDER BY t.id ')