2012-06-05 2 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_' для хранимых процедур. Этот префикс зарезервирован Microsoft для собственного использования в будущем. Используйте что-нибудь еще - просто не 'sp_' ... –

+0

Почему вы возвращаете только номера строк из кода? И использование динамического SQL - это неправильный подход в этом случае. Используйте одну процедуру для таблицы – gbn

+0

. Получите эту идею отсюда: http://www.aspsnippets.com/Articles/Custom-Paging-in-ASP.Net-GridView-using-SQL-Server-Stored-Procedure.aspx –

ответ

0

Ваш запрос должен быть таким:

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

Я думаю, вы не можете использовать его на этом пути. Это похоже на конкатенацию, а не на метод присвоения значений. Я думаю, вы должны справиться с этим в два шага, примерно так:

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. –

Смежные вопросы