我对存储过程有疑问。
我尝试获取结果集的页面和整个集合的记录计数。
每个都是自己动手,但我无法将其合并:
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行和总记录数 在单个查询中?
提前致谢。
答案 0 :(得分: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
您有两个不同的查询,因此您可以运行两个不同的SELECT,并让SQL优化器单独优化每个查询。即使尝试在一个SELECT 中使两个查询都可能,也会产生极大的反作用和次优。
作为旁注,在客户端代码中,任何输出参数仅在 迭代所有返回的结果后才可用。
答案 1 :(得分:0)
以下是我们一直使用的分页过程的内容。它的工作原理是首先将所有匹配的记录转储到临时表(WHERE SPRAS ='D')。
然后从临时表中选择Y页X中的记录。它还包括原始选择的总记录(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