通过存储过程中的分页

时间:2014-06-30 11:16:59

标签: sql-server sql-server-2008 vba ms-access stored-procedures

我有一个存储过程,目前适用于分页。

我如何使用存储过程,我从MS Access传递动态WHERE子句,以便我可以过滤我的数据。

但是当我过滤数据时,@ MaxRowNum仍在计算表中的记录数,而不是添加了WHERE子句的记录数。

是否可以计算WHERE子句中的记录数。

到目前为止,这是我的代码......

CREATE PROCEDURE [dbo].[SP_FINANCIALSWHERE]
@StartRow AS INT,
@EndRow INT,
@ORGCODE AS VARCHAR(6), 
@strWHERE AS VARCHAR(256)
WITH RECOMPILE
AS
BEGIN
SET NOCOUNT ON;
--Declare variables
DECLARE @MaxRowNum INT
DECLARE @SQL NVARCHAR(MAX); 

SET @SQL = N'SELECT @MaxRowNum = COUNT(*)
    FROM dbo.Posting' + @ORGCODE + '

        SELECT
            x2.*
            ,@MaxRowNum as MaxRowNumber
        FROM (

            SELECT
                x1.*
                ,ROW_NUMBER() OVER(ORDER BY PostingID ASC) AS     RowNumber
            FROM (
                SELECT *
                FROM dbo.Posting' + @ORGCODE + '
                WHERE ' + @strWHERE + '
            ) AS x1

        ) AS x2

    WHERE 
        RowNumber BETWEEN @STARTROW AND @ENDROW;';

    EXEC sp_executesql @sql, N'@StartRow INT,@EndRow AS INT, @ORGCODE VARCHAR(6), @strWHERE VARCHAR (256), @MaxRowNum INT', @StartRow, @EndRow,@ORGCODE,@strWHERE, @MaxRowNum; 
END 

我对SQL很陌生,所以请以外行的方式解释。

1 个答案:

答案 0 :(得分:2)

看来,程序中的两个SELECT查询中的第一个是问题。第一个:

SET @SQL = N'SELECT @MaxRowNum = COUNT(*) FROM dbo.Posting' + @ORGCODE + '

正在设置@MaxRowNum。此处未附加WHERE子句,因此您获得@MaxRowNum等于整个表的计数。修改此代码的最简单方法是将上面的行更改为:

SET @SQL = N'SELECT @MaxRowNum = COUNT(*) FROM dbo.Posting' + @ORGCODE + ' WHERE ' + @strWHERE + '

这是包含派生表x1的相同代码。这应该给你与内部查询中的计数相同的计数,因为它是你的内部查询。