Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Постраничный вывод 
V
    Опции темы
KAPJICOH
Дата 13.6.2007, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 18.4.2006

Репутация: нет
Всего: нет



Необходимо написать функция постраничного вывода записей из таблицы. Вот что я накопал и переделал под себя:
Код

ALTER PROCEDURE Limit2
    (
    @TableName varchar(MAX),      //название таблицы
    @Page int,                                //номер страницы
    @PageSize int,                         //количество записей на странице
    @SortRow varchar(MAX),          //название столбца по которому сортируем
    @SortType varchar(MAX)          //по возрастанию или убыванию
    )
AS
            SET NOCOUNT ON
            DECLARE @MinRecord int, @MaxRecord int

            SET  @MinRecord = @Page*@PageSize
            SET  @MAXRecord = @Page*@PageSize+@PageSize
            SET  ROWCOUNT @MaxRecord

            -- создание курсора
            DECLARE @Cursor CURSOR
            SET @Cursor = CURSOR SCROLL KEYSET READ_ONLY FOR
                SELECT * FROM @TableName                         <- Здесь ошибка musr declare table variable
                ORDER BY @SortRow @SortType

            OPEN @Cursor

            -- смещение к нужной записи
            FETCH ABSOLUTE @MinRecord FROM @Cursor
            DECLARE @i int
            SET @i = 0

            -- выор в цикле нужного количества
            WHILE @i < @PageSize
            BEGIN
                FETCH NEXT FROM @Cursor
                SET @i = @i + 1
            END

            CLOSE @Cursor
            DEALLOCATE @Cursor
            SET  ROWCOUNT 0


Как я понял чтобы исправить эту ошибку надо использовать функцию 'EXEC', но что то у меня с ней ничего не получается. Пожалуйста помогите исправить мой код. Спасиба.
PM MAIL   Вверх
kobra
Дата 13.6.2007, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 5
Всего: 9



если правильно понял, реч идет о 2005-ом сервере. а там имеются функции разбиения на страницы. 
Row_Number, OVER, RANK, DENSE_RANK, NTITLE
PM MAIL   Вверх
KAPJICOH
Дата 13.6.2007, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 18.4.2006

Репутация: нет
Всего: нет



Нашел пример где используется функции EXEC для работы с курсором:
Код

-- Create a dynamc read-only cursor 
DECLARE @cursor INT, @query varchar
SET @query = 'SELECT * FROM ' + @TableName + ' ORDER BY ' + @SortRow + ' ' + @SortType
EXEC sp_cursoropen @cursor OUTPUT, @query, 1, 1
-- Fetch the next 3 lines
EXEC sp_cursorfetch @cursor, 16, @MinRecord, @PageSize
-- Close the cursor
EXEC sp_cursorclose @cursor


Процедура выполняется, но в результате ничего не выводится.
PM MAIL   Вверх
KAPJICOH
Дата 13.6.2007, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 18.4.2006

Репутация: нет
Всего: нет



Цитата(kobra @ 13.6.2007,  14:03)
если правильно понял, реч идет о 2005-ом сервере. а там имеются функции разбиения на страницы. 
Row_Number, OVER, RANK, DENSE_RANK, NTITLE

У меня название таблицы задается строкой. При запросе выскакивает ошибка "Must declare the table variable @TableName". Как обойти это?

Это сообщение отредактировал(а) KAPJICOH - 13.6.2007, 16:21
PM MAIL   Вверх
KAPJICOH
Дата 13.6.2007, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 18.4.2006

Репутация: нет
Всего: нет



Все нашел решение в T-SQL. Спасиба kobra.
PM MAIL   Вверх
KAPJICOH
Дата 14.6.2007, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 18.4.2006

Репутация: нет
Всего: нет



Вот моя версия аналога Limit в MySql:
Код

ALTER PROCEDURE Limit2
    (
    @TableName varchar(MAX),
    @Page int,
    @PageSize int,
    @SortRow varchar(MAX),
    @SortType varchar(MAX)
    )
AS
    DECLARE @query nvarchar(MAX), @row_count int, @MinRecord int
    SET @query = N'SELECT @row_count = COUNT(*) FROM ' + @TableName
    EXEC sp_executesql @query, N'@row_count int OUT', @row_count = @row_count OUT
    SET @MinRecord = @Page * @PageSize
    
    IF (@MinRecord > @row_count / 2 )
    BEGIN
        DECLARE @MinRecordStr varchar(10), @MaxRecordStr varchar(10)
        SET @MinRecordStr = cast((@Page * @PageSize + 1) as varchar(10))
        SET @MaxRecordStr = cast((@Page * @PageSize + @PageSize) as varchar(10))
        SET @query = 'SELECT *, ROW_NUMBER() OVER (ORDER BY ' + @SortRow + ' ' +
                    @SortType + ') AS RowNumber    INTO #tmp_tbl_client FROM ' + @TableName + ' ' +
                    'SELECT * FROM #tmp_tbl_client WHERE RowNumber BETWEEN ' + @MinRecordStr +
                    ' AND ' + @MaxRecordStr
                    
        EXECUTE(@query)
        END
    ELSE
    BEGIN
        DECLARE @Count varchar(10), @MaxRecord int, @UnSortType varchar(4)
    
        SET @MaxRecord = cast((@MinRecord + @PageSize) as varchar(10))
        SET @count = cast(@PageSize as varchar(10))
        
        IF @SortType = 'ASC' SET @UnSortType = 'DESC' ELSE SET @UnSortType = 'ASC'
        
        EXECUTE ('SELECT * FROM 
                    (SELECT TOP ' + @Count + ' * FROM 
                        (SELECT TOP ' + @MaxRecord + ' * FROM ' + @TableName + ' 
                        ORDER BY ' + @SortRow + ' ' + @SortType + ') SO1
                     ORDER BY ' + @SortRow + ' ' + @UnSortType + ') 
                SO2 ORDER BY ' + @SortRow + ' ' + @SortType)    
    END

    RETURN



Приму любую критику.

Это сообщение отредактировал(а) KAPJICOH - 14.6.2007, 09:24
PM MAIL   Вверх
kobra
Дата 15.6.2007, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 5
Всего: 9



    @Page int,
    @PageSize int,
    @SortRow varchar(MAX),
    @SortType varchar(MAX)
я бы предусмотрел вариант по умолчанию для этих параметров

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.0558 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.