我有一个存储过程,目前适用于分页。
我如何使用存储过程,我从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很陌生,所以请以外行的方式解释。
答案 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的相同代码。这应该给你与内部查询中的计数相同的计数,因为它是你的内部查询。