在 ;with() select 语句之后更新表

问题描述 投票:0回答:1

我使用此过程来选择带有分页的记录:

ALTER PROCEDURE [PorSun].[soalPagingByIdGroupIdUser]  ( 
   @IdGroup , 
   @pageNo int, 
   @pageSize int)  
AS 
   DECLARE @start int, @end int 
   SET @start = @pageSize*(@pageNo-1)+1 
   SET @end= @start+@pageSIze-1

   ;with Records as
   (
       SELECT 
          PorSun.soal.Id, PorSun.soal.IdUser, PorSun.soal.VisitCount
          , ROW_NUMBER() over(order by PorSun.soal.Id) as RN
       FROM PorSun.soal 
       WHERE (PorSun.soal.IdGroup=@IdGroup)
   )
   SELECT Records.Id, Records.IdUser, Records.VisitCount
   FROM Records
   WHERE RN between @start and @end and (Records.IdGroup=@IdGroup)
   ORDER BY Records.Id desc

   UPDATE [PorSun].[Soal]
   SET [VisitCount] = [VisitCount]+1
   WHERE Id IN (SELECT Id FROM Records)

没有语法错误,但是执行错误。

怎么可能?

sql pagination sql-update with-statement
1个回答
0
投票

您可以使用表变量代替 CTE:

DECLARE @Records TABLE
(
   Id         int,
   IdUser     int,
   VisitCount int,
   RN         int
)

INSERT INTO @Records
SELECT 
    PorSun.soal.Id, 
    PorSun.soal.IdUser, 
    PorSun.soal.VisitCount,
    ROW_NUMBER() over(order by PorSun.soal.Id) as RN
FROM PorSun.soal 
WHERE (PorSun.soal.IdGroup=@IdGroup)


SELECT Id, IdUser, VisitCount
FROM @Records 
WHERE RN between @start and @end and (IdGroup=@IdGroup)
ORDER BY Id desc

UPDATE [PorSun].[Soal]
SET [VisitCount] = [VisitCount]+1
WHERE Id IN (SELECT Id FROM @Records)
© www.soinside.com 2019 - 2024. All rights reserved.