【小问题】关于利用俄罗斯存储过程进行数据分页
存储过程如下:
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
[解决办法]
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