2014-06-30 64 views
0

我有一個當前可用於分頁的存儲過程。通過存儲過程中的分頁

我如何使用存儲過程是,我從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,請在淺白解釋。

回答

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相同的代碼。這應該給你與內部查詢中的計數相同的計數,因爲它是你的內部查詢。