2010-11-04 1 views
1

У меня есть вопрос о хранимых процедурах.Total RecordCount as OUTPUT вычисленного результата в хранимой процедуре

Я пытаюсь получить страницу результирующего набора и количество записей всего набора.

Каждый из этого работает на собственном его, но я не в состоянии объединить его:

ALTER PROCEDURE dbo.pagingSCP 
@PageStart INT, 
@PageSize INT, 
@RecordCount INT OUTPUT 
AS 
BEGIN 
WITH AllRecords AS ( 
SELECT ROW_NUMBER() OVER (ORDER BY MATNR) 
AS Row, viewStyleColorInModul.* 
FROM viewStyleColorInModul WHERE SPRAS = 'D' 
) SELECT * FROM AllRecords WHERE Row between 
@PageStart and @PageStart + @PageSize 
END 

(50 строк (ы), возвращаемый) @RecordCount = 0 @RETURN_VALUE = 0 завершения работы [DBO]. [pagingSCP].

ALTER PROCEDURE dbo.pagingSCP 
@PageStart INT, 
@PageSize INT, 
@RecordCount INT OUTPUT 
AS 
BEGIN 
WITH AllRecords AS ( 
SELECT ROW_NUMBER() OVER (ORDER BY MATNR) 
AS Row, viewStyleColorInModul.* 
FROM viewStyleColorInModul WHERE SPRAS = 'D' 
) SELECT @RecordCount = Count(*) From AllRecords 
END 

Не затронуты нитями. (0 строки (-ы)) @RecordCount = 43770 @RETURN_VALUE = 0 Готовый бег [dbo]. [PagingSCP].

Возможно ли как-то получить 50 строк и общее количество записей в рамках одного запроса?

Заранее спасибо.

ответ

3
ALTER PROCEDURE dbo.pagingSCP 
@PageStart INT, 
@PageSize INT, 
@RecordCount INT OUTPUT 
AS 
BEGIN 
    -- get record count 
    WITH AllRecords AS ( 
    SELECT viewStyleColorInModul.* 
    FROM viewStyleColorInModul WHERE SPRAS = 'D' 
) SELECT @RecordCount = Count(*) From AllRecords; 

    -- now get the records 
    WITH AllRecords AS ( 
    SELECT ROW_NUMBER() OVER (ORDER BY MATNR) 
    AS Row, viewStyleColorInModul.* 
    FROM viewStyleColorInModul WHERE SPRAS = 'D' 
) SELECT * FROM AllRecords 
    WHERE Row between @PageStart and @PageStart + @PageSize; 
END 

У вас есть два различных запросов, для этого eyou запустить два различных SELECT, и пусть SQL оптимизатор оптимизировать каждый по отдельности. Даже если попытаться получить оба запроса в одном SELECT , возможно,, является очень контрпродуктивным и малооптимальным.

В качестве побочного примечания в клиентском коде любой выходной параметр доступен только после, итерация всех возвращенных результатов.

+0

это именно то, о чем мы думали. – csharpnoob

0

Вот мужество пейджинговой обработки, которую мы использовали все время. Он работает, сначала сбрасывая все соответствующие записи в временную таблицу (WHERE SPRAS = 'D').

Затем он выбирает из таблицы temp только записи из страницы X из Y. Он также включает в себя общие записи исходного выбора (WHERE SPRAS = 'D').

ALTER PROCEDURE [dbo].[spSelectTempUsers] 

@Page  int = 0, 
@NumPerPage int = 1 

AS 

SET NOCOUNT ON 

CREATE TABLE #TempData 
(
[RowId]  [int] identity(1,1) , 
[UserId] [int]    , 
[FirstName] [varchar](50)  , 
[LastName] [varchar](50)  , 
[Email]  [varchar](255)  , 
[SPRAS]  [varchar](36) 
) 

INSERT INTO #TempData 
(
[UserId] , 
[FirstName] , 
[LastName] , 
[Email]  , 
[SPRAS]  
) 

SELECT 
[UserId] , 
[FirstName] , 
[LastName] , 
[Email]  , 
[SPRAS]  

FROM viewStyleColorInModul 
WHERE [SPRAS] = 'D' 


DECLARE @Count int 
DECLARE @Pages int 
DECLARE @i  int 
DECLARE @j  int 

IF @Page < 1 SET @Page = 1 
SET @Count = (SELECT COUNT(RowId) FROM #TempData) 
SET @Pages = @Count/@NumPerPage 
IF (@Pages * @NumPerPage) < @Count SET @Pages = @Pages + 1 
IF @Page > @Pages SET @Page = @Pages 
SET @i = ((@Page -1) * @NumPerPage) +1 
SET @j = @Page * @NumPerPage 

SELECT 

ISNULL(t1.UserId,'') as UserId, 
ISNULL(t1.FirstName,'') as FirstName , 
ISNULL(t1.LastName,'') as LastName  , 
ISNULL(t1.Email,'')  as Email  , 
ISNULL(t1.SPRAS,'')  as SPRAS, 

@Pages as Pages, 
@Count as TotalRecords 

FROM #TempData t1 


WHERE t1.RowId >= @i AND t1.RowId <= @j 

ORDER BY t1.RowId 

DROP TABLE #TempData 
SET NOCOUNT OFF 
Смежные вопросы