2012-06-05 46 views
0
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值。在asp.net中使用存儲過程的自定義動態分頁

爲什麼?

請解釋。 感謝

+0

你應該**不要**爲存儲過程使用'sp_'前綴。該前綴已被微軟保留用於未來的使用。使用其他任何東西 - 而不是'sp_' ... –

+0

你爲什麼只是從代碼中返回唯一的行號?在這種情況下使用動態SQL是錯誤的方法。每個表使用一個程序 – gbn

+0

從這裏得到想法:http://www.aspsnippets.com/Articles/Custom-Paging-in-ASP.Net-GridView-using-SQL-Server-Stored-Procedure.aspx –

回答

0

您的查詢必須是這樣的:

通過返回從2個集
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

所以你可以像下面這樣做查詢;

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'; 
0

我想你不能在這種方式使用它。這就像concatanation不是一種賦值方法。我認爲你應該分兩步處理,如下所示:

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) 
+0

我認爲在這種情況下,SQL會說#Results沒有被定義,因爲它在@query的第一次執行範圍內。 –