webForumDet fria alternativet

Problem med lagrad procedur

5 svar · 431 visningar · startad av Vinnaren

VinnarenMedlem sedan sep. 2005833 inlägg
#1

Hej,

Har förljande:

ALTER PROCEDURE dbo.forum_GetPostsToCategory
	(
	@CategoryId int,
	@PageSize int = 30,
	@UserName varchar(256),
	@CurrentPage int = 1
	)
AS
BEGIN

	SELECT p.UserName, p.PostId, p.Header, p.Date, p.Locked, p.Sticky, p.Anonymous, p.Visit
	FROM forum_Post AS p

	  left outer join forum_Post AS op
	  ON op.ParentPostId = p.PostId

	WHERE (p.CategoryId = @CategoryId AND p.ParentPostId = 0) AND p.Deleted = 0
	GROUP BY p.PostId, op.Date, p.ParentPostId, p.CategoryId, p.UserId, p.Header, p.Date, p.Message, p.Locked, p.Sticky, p.Deleted, p.Anonymous, p.Visit, p.UserName
	ORDER BY p.Sticky DESC, LastPostDate DESC

Nu vill jag räkna ut mha av @CurrentPage samt @PageSize vilka poster som ska hämtas. I MySQL går det ju att anv. LIMIT men hur gör man i MSSQL? Om man tex enbart ska visa posterna 31-60?

Tacksam för all hjälp :stud

doggelitoMedlem sedan juni 20003 076 inlägg
Peter SMedlem sedan dec. 20025 483 inlägg
#3
ALTER PROCEDURE dbo.forum_GetPostsToCategory
	(
	@CategoryId int,
	@PageSize int = 30,
	@UserName varchar(256),
	@CurrentPage int = 1
	)
AS
BEGIN

	WITH forumPosts AS
	(
		SELECT p.UserName, p.PostId, p.Header, p.Date, p.Locked, p.Sticky, p.Anonymous, p.Visit, p.LastPostDate, ROW_NUMBER() OVER (p.Sticky DESC, LastPostDate DESC) AS RowNumber
		FROM forum_Post AS p

		left outer join forum_Post AS op
		ON op.ParentPostId = p.PostId

		WHERE (p.CategoryId = @CategoryId AND p.ParentPostId = 0) AND p.Deleted = 0
		GROUP BY p.PostId, op.Date, p.ParentPostId, p.CategoryId, p.UserId, p.Header, p.Date, p.Message, p.Locked, p.Sticky, p.Deleted, p.Anonymous, p.Visit, p.UserName, p.LastPostDate
	)

	DECLARE @startRow int
	DECLARE @endRow int

	SELECT @startRow = (@CurrentPage - 1) * @PageSize + 1
	SELECT @endRow = @startRow + @pageSize - 1

	SELECT * FROM forumPosts f WHERE f.RowNumber BETWEEN @startRow AND @endRow ORDER BY f.Sticky DESC, f.LastPostDate DESC

Notera att jag lagt till p.LastPostDate.

Varför har du med GROUP BY, är det nödvändigt?

VinnarenMedlem sedan sep. 2005833 inlägg
#4

Tack, får dock felmeddelandet "Incorrect syntax near '.'." Inte mycket den talade om :(
Ang. GROUP BY så vet jag inte om det behövs, la till de allt eftersom felmeddelanden kom ang det.
Så frågan är då vad syntax felet är?

Peter SMedlem sedan dec. 20025 483 inlägg
#5

Oops, så här skall det vara:

CREATE PROCEDURE dbo.forum_GetPostsToCategory
	(
	@CategoryId int,
	@PageSize int = 30,
	@UserName varchar(256),
	@CurrentPage int = 1
	)
AS
BEGIN

	WITH forumPosts AS
	(
		SELECT p.UserName, p.PostId, p.Header, p.Date, p.Locked, p.Sticky, p.Anonymous, p.Visit, p.LastPostDate, ROW_NUMBER() OVER (ORDER BY p.Sticky DESC, p.LastPostDate DESC) AS RowNumber
		FROM forum_Post AS p

		left outer join forum_Post AS op
		ON op.ParentPostId = p.PostId

		WHERE (p.CategoryId = @CategoryId AND p.ParentPostId = 0) AND p.Deleted = 0
		GROUP BY p.PostId, op.Date, p.ParentPostId, p.CategoryId, p.UserId, p.Header, p.Date, p.Message, p.Locked, p.Sticky, p.Deleted, p.Anonymous, p.Visit, p.UserName, p.LastPostDate
	)

	SELECT * FROM forumPosts f WHERE f.RowNumber BETWEEN (@CurrentPage - 1) * @PageSize + 1 AND @PageSize * @CurrentPage ORDER BY f.Sticky DESC, f.LastPostDate DESC
VinnarenMedlem sedan sep. 2005833 inlägg
#6

tack, verkar funka kanon :)

132 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)