Sql server 分页的存储过程不工作
我正在asp.net应用程序中实现分页。为此,我创建了一个存储过程来从CommunityPost表中获取记录。但此存储过程工作不正常。它不返回任何记录 我的存储过程是:Sql server 分页的存储过程不工作,sql-server,stored-procedures,Sql Server,Stored Procedures,我正在asp.net应用程序中实现分页。为此,我创建了一个存储过程来从CommunityPost表中获取记录。但此存储过程工作不正常。它不返回任何记录 我的存储过程是: ALTER PROCEDURE [dbo].[CommunityPostLoadAllPaged] ( @PageIndex int = 0, @PageSize int = 2147483644, @TotalRecords int = null OUTPUT ) AS BEGIN
ALTER PROCEDURE [dbo].[CommunityPostLoadAllPaged]
(
@PageIndex int = 0,
@PageSize int = 2147483644,
@TotalRecords int = null OUTPUT
)
AS
BEGIN
DECLARE @sql nvarchar(max)
--paging
DECLARE @PageLowerBound int
DECLARE @PageUpperBound int
DECLARE @RowsToReturn int
SET @RowsToReturn = @PageSize * (@PageIndex + 1)
SET @PageLowerBound = @PageSize * @PageIndex
SET @PageUpperBound = @PageLowerBound + @PageSize + 1
CREATE TABLE #DisplayOrderTmp
(
[Id] int IDENTITY (1, 1) NOT NULL,
[CommunityPostId] int NOT NULL
)
SET @sql = '
INSERT INTO #DisplayOrderTmp ([CommunityPostId])
SELECT p.Id
FROM
CommunityPost p with (NOLOCK)'
CREATE TABLE #PageIndex
(
[IndexId] int IDENTITY (1, 1) NOT NULL,
CommunityPostId int NOT NULL
)
INSERT INTO #PageIndex (CommunityPostId)
SELECT CommunityPostId
FROM #DisplayOrderTmp
GROUP BY CommunityPostId
ORDER BY min([Id])
SELECT *
FROM #PageIndex
--total records
SET @TotalRecords = @@rowcount
select * from #DisplayOrderTmp
DROP TABLE #DisplayOrderTmp
select * from #PageIndex
--return products
SELECT TOP (@RowsToReturn)
p.*
FROM
#PageIndex [pi]
INNER JOIN
dbo.CommunityPost p WITH (NOLOCK) ON p.Id = [pi].CommunityPostId
WHERE
[pi].IndexId > @PageLowerBound AND
[pi].IndexId < @PageUpperBound
ORDER BY
[pi].IndexId
DROP TABLE #PageIndex
END
如何获取用于分页实现的CommunityPost记录
请帮帮我
提前谢谢你。这个问题有很多奇怪的地方 最重要的是:您将@sql设置为运行一些动态sql,然后-不调用它。我看不出有任何理由将该查询作为动态SQL运行,因为其中没有变量。只要运行代码就行了 其次,在过程中运行多个选择。这是一种常见的调试技术,但可能不是您在完成的代码中想要的。如果您真的希望它返回一个表,那么在最后一个表之前删除所有选择,当然除了插入临时表的选择。实际上,它将输出几组值,我猜您的调用代码只需要其中一个 第三,MinId的命令意味着什么?我猜你的目标是按身份订购,但也许不是 第四,您的默认值@PageSize非常大,几乎不低于整数的最大限制。您将它乘以某个值,然后将其插入另一个整数值中。如果使用默认值,实际上肯定会溢出。这就是目的吗 祝你好运,试试这个
ALTER PROCEDURE [dbo].[CommunityPostLoadAllPaged]
(
@PageIndex int = 0,
@PageSize int = 50,
@TotalRecords int = null OUTPUT
)
AS
BEGIN
Declare @inEndRow Int
,@inStartRow Int
CREATE TABLE #DisplayOrderTmp
(
[Id] int IDENTITY (1, 1) NOT NULL,
[inRowNum] Int Primary Key,
[CommunityPostId] int NOT NULL
)
INSERT INTO #DisplayOrderTmp ([CommunityPostId])
SELECT ROW_NUMBER() OVER(ORDER BY p.Id asc), p.Id
FROM
CommunityPost p with (NOLOCK)
Select @TotalRecords = Count(1)
,@inEndRow = ((@PageIndex + @PageSize ) + 1)
,@inStartRow = @PageIndex
From #DisplayOrderTmp As d With (Nolock)
Select *
From #DisplayOrderTmp As d With (Nolock)
Where d.inRowNum > @inStartRow
And d.inRowNum < @inEndRow
END
Id是您的主键吗?当您甚至没有加载该表时,为什么要从DisplayOrderTmp中选择*?您必须从PageIndex中选择*,然后进行最终选择。除非你有很好的理由不这样做,否则不要选择所有不是你想要的实际结果集的选项。
ALTER PROCEDURE [dbo].[CommunityPostLoadAllPaged]
(
@PageIndex int = 0,
@PageSize int = 50,
@TotalRecords int = null OUTPUT
)
AS
BEGIN
Declare @inEndRow Int
,@inStartRow Int
CREATE TABLE #DisplayOrderTmp
(
[Id] int IDENTITY (1, 1) NOT NULL,
[inRowNum] Int Primary Key,
[CommunityPostId] int NOT NULL
)
INSERT INTO #DisplayOrderTmp ([CommunityPostId])
SELECT ROW_NUMBER() OVER(ORDER BY p.Id asc), p.Id
FROM
CommunityPost p with (NOLOCK)
Select @TotalRecords = Count(1)
,@inEndRow = ((@PageIndex + @PageSize ) + 1)
,@inStartRow = @PageIndex
From #DisplayOrderTmp As d With (Nolock)
Select *
From #DisplayOrderTmp As d With (Nolock)
Where d.inRowNum > @inStartRow
And d.inRowNum < @inEndRow
END