首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

【小疑点】关于利用俄罗斯存储过程进行数据分页

2012-02-05 
【小问题】关于利用俄罗斯存储过程进行数据分页存储过程如下:SET QUOTED_IDENTIFIER ONGOSET ANSI_NULLS ONG

【小问题】关于利用俄罗斯存储过程进行数据分页
存储过程如下:
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 ')
END
SET NOCOUNT OFF




GO
SET QUOTED_IDENTIFIER OFF
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 @SqlStr NVarchar(8000) DECLARE @PageLowerBound int --当前页最前记录
DECLARE @PageUpperBound int --当前页最末记录

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

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

END
SET NOCOUNT OFF


GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
[解决办法]

SQL code
ALTER    PROC [GetPage]     @PageSize int, --每页记录数    @PageIndex int, -- 当前返回页    @TableName varchar(50), --数据表名称     @RowFiler varchar(500), --查询字句,WHERE后面的部分    @SortExp varchar(500) --排序字句,ORDER BY后面的部分     AS     SET NOCOUNT ON     BEGIN         DECLARE @SqlStr NVarchar(4000)     DECLARE @PageLowerBound int --当前页最前记录         DECLARE @PageUpperBound int --当前页最末记录         SET @PageLowerBound = (@PageIndex - 1) * @PageSize         SET @PageUpperBound = @PageLowerBound + @PageSize          SET ROWCOUNT @PageUpperBound        SET @SqlStr = N ' DECLARE @IndexTable TABLE(id int IDENTITY(1,1),nid int)   '                  +N ' INSERT INTO @IndexTable(nid) SELECT ID FROM  '+@TableName+N ' WHERE  '+@RowFiler+N ' ORDER BY  '+@SortExp                   +N ' SELECT O.* FROM  ' + @TableName + N ' O,@IndexTable t WHERE O.ID=t.nid AND t.id >@PageLowerBound AND t.id <=@PageUpperBound ORDER BY t.id '         EXEC sp_executesql @SqlStr,N '@PageLowerBound int,@PageUpperBound int ',@PageLowerBound,@PageUpperBound      END 

热点排行