【问题标题】:Custom dynamic paging using stored procedure in asp.net使用 asp.net 中的存储过程自定义动态分页
【发布时间】:2012-06-05 05:57:14
【问题描述】:
CREATE PROCEDURE [dbo].[sp_GetPageWiseData]
(
    @tableName sysname,
    @orderColumn nvarchar(100),
    @PageIndex INT = 1,
    @PageSize INT = 10,
    @RecordCount varchar(10) OUTPUT
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @query varchar(2000),
        @minimumIndex varchar(5),
        @maximumIndex varchar(5)

SET @minimumIndex=convert(varchar,(@PageIndex - 1) * @PageSize + 1)
SET @maximumIndex=convert(varchar,@PageIndex * @PageSize)

SET @query='SELECT ROW_NUMBER() OVER(ORDER BY ' + @orderColumn + ' ASC)AS RowNumber,* INTO #Results FROM ' + @tableName + ';
            SELECT ' + @RecordCount + '=COUNT(*) FROM #Results;
            SELECT * FROM #Results WHERE RowNumber BETWEEN ' + @minimumIndex + ' AND ' + @maximumIndex + ';
            DROP TABLE #Results'
Exec (@query)   
END

这里的问题是当程序执行时,输出参数@RecordCount显示NULL值。

为什么?

请解释一下。 谢谢

【问题讨论】:

  • 您应该为您的存储过程使用sp_ 前缀。该前缀已由 Microsoft 保留以供其将来使用。使用其他任何东西 - 只是不要 sp_ ...
  • 为什么只从代码中返回行号?在这种情况下,使用动态 SQL 是错误的方法。每个表使用一个过程
  • 从这里获取想法:aspsnippets.com/Articles/…

标签: asp.net sql-server paging


【解决方案1】:

您的查询必须是这样的:

SET @query='SELECT ROW_NUMBER() OVER(ORDER BY ' + @orderColumn + ' ASC)AS RowNumber,* INTO #Results FROM ' + @tableName + ';
        SELECT  @RecordCount =COUNT(*) FROM #Results;
        SELECT * FROM #Results WHERE RowNumber BETWEEN ' + @minimumIndex + ' AND ' + @maximumIndex + ';
        DROP TABLE #Results';

但是这里系统会要求你声明变量@RecordCount

所以你可以通过从查询中返回 2 个数据集来做到这一点;

SET @query='DECLARE @RecordCount varchar(10); SELECT ROW_NUMBER() OVER(ORDER BY ' + @orderColumn + ' ASC)AS RowNumber,* INTO #Results FROM ' + @tableName + ';
        SELECT  @RecordCount =COUNT(*) FROM #Results;
        SELECT * FROM #Results WHERE RowNumber BETWEEN ' + @minimumIndex + ' AND ' + @maximumIndex + ';
        SELECT @RecordCount AS TOTALRECORDS;
        DROP TABLE #Results';

【讨论】:

    【解决方案2】:

    我认为你不能以这种方式使用它。这就像连接而不是值分配方法。我认为您应该分两步处理它,如下所示:

    SET @query='SELECT ROW_NUMBER() OVER(ORDER BY ' + @orderColumn + ' ASC)AS RowNumber,* INTO #Results FROM ' + @tableName + ';'
    
    Exec (@query)
    
    SELECT @RecordCount =COUNT(*) FROM #Results
    
    SET @query='SELECT * FROM #Results WHERE RowNumber BETWEEN ' + @minimumIndex + ' AND ' + @maximumIndex + ';
    DROP TABLE #Results'
    
    Exec (@query)
    

    【讨论】:

    • 我认为在这种情况下SQL会说#Results没有定义,因为它在@query的第一次执行范围内。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2019-12-14
    • 2020-10-01
    相关资源
    最近更新 更多