Получить количество записей, возвращенных хранимой процедуры

голоса
0

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

Вот процедура:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[zsp_GetUsersAdministratorPanel]
    (@StartRowIndex INT,
     @MaxRows INT,
     @OrderByField NVARCHAR(200),
     @Asc BIT,
     @SearchValue NVARCHAR(200) = NULL)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @UsersTable TABLE(UserId int,
                              FirstName nvarchar(400),
                              LastName nvarchar(400),
                              Email nvarchar(200)
                             )  

    DECLARE @WhereQuery nvarchar(max)

    SET @WhereQuery = ' WHERE '

    IF LEN(@SearchValue) > 0
        BEGIN
                SET @WhereQuery = @WhereQuery +
                  'FirstName like ''%' + @SearchValue + '%''  or '
                + ' LastName like ''%' + @SearchValue + '%''  or '
                + ' Email like ''%' + @SearchValue + '%'''
        END
    ELSE
    BEGIN 
    set @WhereQuery = ' '
    END
    DECLARE @OrderQuery nvarchar(max)

    IF LEN(@OrderByField) > 0
        BEGIN
            IF @OrderByField = 'Email'
                SET @OrderQuery = ' ORDER BY Email ' +
                    CASE @Asc WHEN 1 
                    THEN ' ASC ' ELSE ' DESC ' END
            ELSE IF @OrderByField = 'FirstName'
                SET @OrderQuery =
                    ' ORDER BY FirstName ' +  
                    CASE @Asc WHEN 1 
                    THEN ' ASC ' ELSE ' DESC '  END
            ELSE IF @OrderByField = 'LastName'  
                SET @OrderQuery = ' ORDER BY LastName ' +  
                    CASE @Asc WHEN 1 
                    THEN ' ASC ' ELSE ' DESC '  END     

        END 

    DECLARE @Query  NVARCHAR(MAX)
    SET @Query = 'select UserId, 
                FirstName,
                LastName,
                Email,
                @@ROWCOUNT as TotalRows
            from 
            (


                SELECT  ROW_NUMBER() OVER ('+ @OrderQuery +')
                    AS [ROW_NUMBER], 
                        [t0].[UserId], [t0].[FirstName], 
                        [t0].[LastName], 
                        [t0].[Email]
                        FROM [dbo].[Users] AS [t0]' +
                        @WhereQuery +
            ') AS [t1]' +
                 + ' WHERE [ROW_NUMBER] BETWEEN 
                    @StartRowIndex AND @MaxRows' + @OrderQuery

    PRINT @Query

    INSERT IGNORE  INTO @UsersTable EXEC sp_Executesql @Query,
                    N'@OrderQuery nvarchar(max),
                    @StartRowIndex int,@MaxRows int',
                    @[email protected],
                    @StartRowIndex = @StartRowIndex,
                    @MaxRows = @MaxRows

    SELECT * FROM @UsersTable           

    SET NOCOUNT OFF;
END

Как я могу добиться этого, кто-то может помочь мне, пожалуйста? :)

Я предполагаю , что я должен использовать @@RowCount, но я не слишком уверен , где?

PS Ребята, что я имею в виду, что я получаю результаты, возвращенные «Где» заявления, а не только размер страницы ??

PS также ребята, если у вас есть какие-либо предложения по улучшению времени выполнения этой процедуры, пожалуйста, сделайте это :)

Задан 26/03/2018 в 19:14
пользователем
На других языках...                            


2 ответов

голоса
1

Добавьте столбец для ROWCOUNT к переменной таблице:

DECLARE @UsersTable TABLE(TotalRows int, UserId int, ...

Вы можете изменить сгенерированный SQL, как:

SET @Query = '
    SELECT  TotalRows, UserId, ...
    FROM    (
            SELECT  ROW_NUMBER() OVER ('+ @OrderQuery +') AS RowNum
            ,       COUNT(*) OVER () AS TotalRows
            ,       ...
            ) AS t1
    WHERE   RowNum BETWEEN ...

Теперь ваша процедура возвращает общее количество строк в первом столбце.

Ответил 26/03/2018 в 19:20
источник пользователем

голоса
1

Я что-то подобное мышление:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[zsp_GetUsersAdministratorPanel]
    (@StartRowIndex INT,
     @MaxRows INT,
     @OrderByField NVARCHAR(200),
     @Asc BIT,
     @SearchValue NVARCHAR(200) = NULL)
AS
BEGIN
    SET NOCOUNT ON;
    declare @counter int = 0
    DECLARE @UsersTable TABLE(UserId int,
                              FirstName nvarchar(400),
                              LastName nvarchar(400),
                              Email nvarchar(200)
                             )  

    DECLARE @WhereQuery nvarchar(max)

    SET @WhereQuery = ' WHERE '

    IF LEN(@SearchValue) > 0
        BEGIN
                SET @WhereQuery = @WhereQuery +
                  'FirstName like ''%' + @SearchValue + '%''  or '
                + ' LastName like ''%' + @SearchValue + '%''  or '
                + ' Email like ''%' + @SearchValue + '%'''
        END
    ELSE
    BEGIN 
    set @WhereQuery = ' '
    END
    DECLARE @OrderQuery nvarchar(max)

    IF LEN(@OrderByField) > 0
        BEGIN
            IF @OrderByField = 'Email'
                SET @OrderQuery = ' ORDER BY Email ' +
                    CASE @Asc WHEN 1 
                    THEN ' ASC ' ELSE ' DESC ' END
            ELSE IF @OrderByField = 'FirstName'
                SET @OrderQuery =
                    ' ORDER BY FirstName ' +  
                    CASE @Asc WHEN 1 
                    THEN ' ASC ' ELSE ' DESC '  END
            ELSE IF @OrderByField = 'LastName'  
                SET @OrderQuery = ' ORDER BY LastName ' +  
                    CASE @Asc WHEN 1 
                    THEN ' ASC ' ELSE ' DESC '  END     

        END 

    DECLARE @Query  NVARCHAR(MAX)
    SET @Query = 'select UserId, 
                FirstName,
                LastName,
                Email,
                @@ROWCOUNT as TotalRows
            from 
            (


                SELECT  ROW_NUMBER() OVER ('+ @OrderQuery +')
                    AS [ROW_NUMBER], 
                        [t0].[UserId], [t0].[FirstName], 
                        [t0].[LastName], 
                        [t0].[Email]
                        FROM [dbo].[Users] AS [t0]' +
                        @WhereQuery +
            ') AS [t1]' +
                 + ' WHERE [ROW_NUMBER] BETWEEN 
                    @StartRowIndex AND @MaxRows' + @OrderQuery

    PRINT @Query

    INSERT IGNORE  INTO @UsersTable EXEC sp_Executesql @Query,
                    N'@OrderQuery nvarchar(max),
                    @StartRowIndex int,@MaxRows int',
                    @[email protected],
                    @StartRowIndex = @StartRowIndex,
                    @MaxRows = @MaxRows

select @[email protected][email protected]@rowcount
select @counter

    SELECT * FROM @UsersTable           

    SET NOCOUNT OFF;
END
Ответил 26/03/2018 в 19:31
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more