我正在我的asp.net应用程序中实现分页。为此,我创建了一个存储过程来从CommunityPost
表中获取记录。但是这个存储过程无法正常工作。它不会返回任何记录。
我的存储过程是:
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
表的表架构:
ColumnName DataType
================================
Id int
SharerId int
Text nvarchar(MAX)
Published bit
CreatedOnUtc datetime
如何获取分页实施的CommunityPost
条记录?
请帮帮我。
提前谢谢。
答案 0 :(得分:2)
尝试这个
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
答案 1 :(得分:0)
该查询中有很多奇怪的事情。
最重要的是:您正在设置@sql
,好像要运行一些动态SQL,然后 - 不要调用它。我无法看到任何理由将该查询作为动态SQL运行,其中没有变量。只需运行代码。
其次,您在此过程中运行多个SELECT
。这是一种常见的调试技术,但在完成的代码中可能不是您想要的。如果你真的希望它返回一个表,那么在最后一个表之前取出所有SELECT
(当然,除了那些插入临时表的那些)。实际上,它会输出几组值,并且我猜测你的调用代码只是期望其中一个。
第三,ORDER BY Min(Id)
意味着什么?我想你的目标是ORDER BY id
,但也许不是。
第四,您的默认值@PageSize
很大,几乎不会低于INT
的最高限额。然后你将它与某个东西相乘,并将其插入另一个INT
值。如果默认使用,那几乎可以保证溢出。这是意图吗?
祝你好运,