'How to use to loop with paging in SQL Server query ?
I have a SQL query which returns around 350,000 records (this can differ based in criteria). I am adding paging for better performance. What I want is, first load 1000 records and keep going until 350,000.
How can I achieve this?
- Get a count of a query and add a loop? If yes, how to set
@Iteratorvalue? - Do I need to use
;WITH AS ()?
I am setting @PageSize count to total number of records I want (Is this correct?). Here I get 20412 records. If I set @PageSize to 1000 then not sure how to get next 1000 records and so on.
Query:
-- USING GENERAL PAGING
DECLARE @ConceptId INT, @PageNumber INT, @PageSize INT, @Iterator INT
SET @ConceptId = 2076
SET @PageNumber = 1
SET @PageSize =
(
SELECT COUNT(*)
FROM ScheduledBulkUpdate(NOLOCK) SBU
INNER JOIN ScheduledBulkUpdateRecurring(NOLOCK) SBR ON SBR.BatchId = SBU.BatchId
WHERE SBU.ConceptId = @ConceptId
)
SET @Iterator = 0
PRINT @PageSize
--WHILE (@Iterator < @PageSize)
--BEGIN
SELECT DISTINCT SBU.BatchId AS Status,
CAST(SBR.ExecutionTime AS DATE) AS StartRunDate,
CAST(SBR.ExecutionTime AS TIME) AS StartRunTime,
CAST(SBR.ExecutionTime AS DATE) AS EndRunDate,
CAST(SBR.ExecutionTime AS TIME) AS EndRunTime,
SBU.ScheduleID AS JobId,
SBU.Name AS JobName,
(
SELECT concept
FROM Concept
WHERE conceptid = SBU.ConceptId
) AS ConceptName,
SBU.ConceptId AS ConceptId,
CAST(SBU.ScheduledStartDateTime AS DATE) AS StartDate,
CAST(SBU.ScheduledEndDateTime AS DATE) AS EndDate,
SBU.Frequency AS Frequency,
SBU.Query AS Query,
SBU.Submitter AS Submitter
FROM ScheduledBulkUpdate(NOLOCK) SBU
INNER JOIN ScheduledBulkUpdateRecurring(NOLOCK) SBR ON SBR.BatchId = SBU.BatchId
WHERE SBU.ConceptId = @ConceptId
ORDER BY SBU.BatchId
OFFSET @PageSize * (@PageNumber - 1) ROWS
FETCH NEXT @PageSize ROWS ONLY
--Set @Iterator = @Iterator + 1
--END
Solution 1:[1]
Try this
DECLARE @ConceptId INT = 2076, @PageNumber INT= 1, @PageSize INT = 1000, @totalPage int
SELECT @totalPage = (count(*)/@PageSize)+1
FROM ScheduledBulkUpdate(NOLOCK) SBU
INNER JOIN ScheduledBulkUpdateRecurring(NOLOCK) SBR ON SBR.BatchId = SBU.BatchId
WHERE SBU.ConceptId = @ConceptId
PRINT @PageSize
WHILE (@totalPage >= @PageNumber)
BEGIN
SELECT DISTINCT SBU.BatchId AS Status,
CAST(SBR.ExecutionTime AS DATE) AS StartRunDate,
CAST(SBR.ExecutionTime AS TIME) AS StartRunTime,
CAST(SBR.ExecutionTime AS DATE) AS EndRunDate,
CAST(SBR.ExecutionTime AS TIME) AS EndRunTime,
SBU.ScheduleID AS JobId,
SBU.Name AS JobName,
(
SELECT concept
FROM Concept
WHERE conceptid = SBU.ConceptId
) AS ConceptName,
SBU.ConceptId AS ConceptId,
CAST(SBU.ScheduledStartDateTime AS DATE) AS StartDate,
CAST(SBU.ScheduledEndDateTime AS DATE) AS EndDate,
SBU.Frequency AS Frequency,
SBU.Query AS Query,
SBU.Submitter AS Submitter
FROM ScheduledBulkUpdate(NOLOCK) SBU
INNER JOIN ScheduledBulkUpdateRecurring(NOLOCK) SBR ON SBR.BatchId = SBU.BatchId
WHERE SBU.ConceptId = @ConceptId
ORDER BY SBU.BatchId
OFFSET @PageSize * (@PageNumber - 1) ROWS
FETCH NEXT @PageSize ROWS ONLY
set @PageNumber = @PageNumber + 1
END
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Jayrag Pareek |
