powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Надо вот такой вопрос
16 сообщений из 16, страница 1 из 1
Надо вот такой вопрос
    #32006905
Andy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ подскажите можно ли такое сотворить средствами TSQL...
Таблица без ключа... Не допускается создание временной таблицы...
Запросу дается два параметра "Максимальное количество строк на странице", "Номер страницы"
Запрос разбивает все строки по страницам (1 страница равна "Макс. кол-ву строк") и возвращает нужную страницу, то есть строки из нужной страницы.
...
Рейтинг: 0 / 0
Надо вот такой вопрос
    #32006909
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Таблица без ключа...
Круто

Ну, если временная таблица отметается (интересно почему), то тогда разве что курсором, о производительности умолчу
...
Рейтинг: 0 / 0
Надо вот такой вопрос
    #32006915
Кривовато, но работает %)
Какой то ключ, по которому отсортироваты записи, ввести все равно придется.

DECLARE @RowCount int
, @PageNr int
, @LowVl varchar(10)
, @HiVl varchar(10)
, @Sql varchar(500)

SET @RowCount = 10
SET @PageNr = 10
SET @LowVl = convert( varchar(10), @RowCount * @PageNr )
SET @HiVl = convert( varchar(10), @RowCount * ( @PageNr+1 ) )

SET @Sql = 'SELECT
*
FROM
( SELECT TOP '+ @HiVl +' FieldID FROM tbTable ) as Q1

LEFT JOIN ( SELECT TOP '+ @LowVl +' FieldID FROM tbTable ) as Q2 ON
Q1.FieldID = Q2.FieldID
WHERE
Q2.FieldID IS NULL'
EXEC( @Sql )

Удачи
...
Рейтинг: 0 / 0
Надо вот такой вопрос
    #32006917
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Дмитрий Голубев

Хех, а по условию в табличке ключиков то нет следовательно FieldID не уникально, как думаете, какой результат будет у Вашего запроса

А в общем мне идея понравилась.
...
Рейтинг: 0 / 0
Надо вот такой вопрос
    #32006921
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, передумал, уже не нравится идея

Такой запрос не будет гарантированно выдавать нужные страницы, записи то не упорядочены, разве что с индексом, да и то сомневаюсь я.
...
Рейтинг: 0 / 0
Надо вот такой вопрос
    #32006954
Andy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо... ваш запрос тоже гениальный...
Но по условию мне действительно нельзя привязываться к ключи... а он конечно есть и не один...Решение нашел чем и делюсь...

DECLARE @RowCount int
, @PageNr int
, @LowVl varchar(10)
, @HiVl varchar(10)
, @Sql varchar(500)

SET @RowCount = 10
SET @PageNr = 6
SET @LowVl = convert( varchar(10), @RowCount * @PageNr )
SET @HiVl = convert( varchar(10), @RowCount * @PageNr+ @RowCount)

SET @Sql = 'SELECT IDENTITYCOL as id, [Name], phone FROM Tel_inf
WHERE id Between '+@LowVl+' and '+@HiVl
EXEC( @Sql )
...
Рейтинг: 0 / 0
Надо вот такой вопрос
    #32006957
2 Genady
По идее если добавить ORDER BY, то должно выдавать корректный результат.
Хотя мне тоже мой вариант не очень нравится, т.к. при большом кол-ве записей работать будет довольно медленно.
Но как видите, ключик всетаки существует.
...
Рейтинг: 0 / 0
Надо вот такой вопрос
    #32006962
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Andy

А если дырки будут в identity поле, результат запроса Вас все равно устроит?

2 Дмитрий Голубев

Да нет, если использовать курсор, то скорее всего будет еще медленней. Order by конечно поможе, вот только если кто нить вклинится между такими запросами и добавит данные (или наоборот удалит), вот тогда весело будет
...
Рейтинг: 0 / 0
Надо вот такой вопрос
    #32006964
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Andy

А Вы то зачем Exec() используете, почему нельзя просто написать:

SELECT IDENTITYCOL as id, [Name], phone FROM Tel_inf
WHERE id Between @LowVl and @HiVl

???


Про дырки в IDENTITY Genady уже заметил. Есть еще один момент: Вы пишите IDENTITYCOL as id, а затем сравниваете это id. Скорее всего поле id у Вас уже есть в таблице и оно как раз и есть IDENTITY(и почему это не ключ?). Но тогда не проще ли сразу писать "SELECT id, [Name]..." ? Если же у Вас есть другое поле id, то имейте ввиду что именно оно будет сравниваться во WREHE, а не то, которому Вы дали алиас id.

Вообщем это тоже не решение, а самообман.

А можно поинтересоваться почему "Не допускается создание временной таблицы"?
...
Рейтинг: 0 / 0
Надо вот такой вопрос
    #32006969
Andy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Genady

Честно говоря не очень понял относительно дырок... Если можно подробнее
...

2 Всем...
Чтоб не было споров
описываю задачу...
Вэб приложение ... таблица и n-ое количество полей добавляющих в запрос условия выборки из SQL таблицы...которые отображаются в таблице на страничке...
Раз вэб значит создание никаких временных таблиц не допустимо...
Раз много условий выборки значения родных для таблицы ключей не имеет смысла... и привязываться к ним нельзя...
и как я говорил надо выводить информацию с разбиением по страницам... и кнопки назад, вперед, в конец, в начало..
Вот по этому вбираем данные создаем искуственное последовательное поле ключа для них... и по значению этого поля разбиваем на страницы...

А синтаксис запроса я просто сохранил поскольку к нему привыкли...


Вроде все правильно... разве нет...
...
Рейтинг: 0 / 0
Надо вот такой вопрос
    #32006971
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Честно говоря не очень понял относительно дырок... Если можно подробнее
Объясняю
у Вас есть записи с айдишками 1, 2, 3, 4 затем удаляется запись 2 и Вы получаете 1, 3, 4, затем добавляется запись 5 и тут же удаляется при добавлении следующей записи Вы получите 1, 3, 4, 6.

> Раз вэб значит создание никаких временных таблиц не допустимо...

Странное утверждение, а почему сбсно?

>Раз много условий выборки значения родных для таблицы ключей не имеет смысла... и привязываться к ним нельзя...

Еще более запутано. Причем здесь ключ?
...
Рейтинг: 0 / 0
Надо вот такой вопрос
    #32006974
Andy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про дырки...

А собственно когда и кем удаляются записи... запрос на выборку отработал.. пронумеровал строки.. зачем в нем данные править... данные правятся отдельными запросами... insert update...

Временные таблицы...

Кстати интересный вопрос... просветите... 100 пользователей одновременно создают в tempdb таблицу с одним и тем же именем.. Будут конфликты...?

Даже если не будет.. мне кажется один запрос с INENTITYCOL будет менее гнуть производительность чем два с созданием временной таблицы... один создает другой выбирает... к тому же в создании будет та же функция... IDENTITY(int,1,1)
...
Рейтинг: 0 / 0
Надо вот такой вопрос
    #32006980
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>А собственно когда и кем удаляются записи... запрос на выборку отработал.. пронумеровал строки.. зачем в нем данные править... данные правятся отдельными запросами... insert update...

Запрос не нумерует строки, а возвращает значения поля identity, которе есть в Вашей таблице, попробуте удалить это поле и выполнить запрос

>Кстати интересный вопрос... просветите... 100 пользователей одновременно создают в tempdb таблицу с одним и тем же именем.. Будут конфликты...?

Нет, конечно не будет конфликтов, временная таблица видна только в рамках коннекта. Используйте временную таблицу и не мучайтесь

Можно использовать запрос Дмитрия Голубева, но только если таблица используется только для чтения, иначе поимеете проблемы о которых я писал в ответе ему.
...
Рейтинг: 0 / 0
Надо вот такой вопрос
    #32006981
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Andy
Так надо было сразу и сказать что есть ключ и это id

Можно так:

DECLARE @RowCount int
, @PageNr int
, @LowVl varchar(10)
, @CountStr varchar(10)
, @Sql varchar(500)
, @maxID int

SET @RowCount = 10
SET @PageNr = 10
SET @LowVl = convert( varchar(10), @RowCount * @PageNr )
SET @CountStr = convert( varchar(10), @RowCount )


SET @Sql = 'SELECT @mid=top '+@LowVl+' id from tbl order by id'
exec sp_executesql @Sql, N'@mid int out', @maxID out

SET @Sql = 'SELECT top '+@CountStr+' id from tbl where id > @maxID order by id'

exec sp_executesql @Sql, N'@mid int ', @maxID

Я не проверял, могут быть ошибки, но суть понять можно

Можно всё-таки делать через временные таблицы(конфликтов не будет и скорость будет приемлиемая, зря Вы ими не пользуетесь), а если у Вас 2000-й - то через таблицы-переменные. Может если и будет чуть помедленней, но хоть потом можно будет разобраться в написанном.

С приветом Сергей
...
Рейтинг: 0 / 0
Надо вот такой вопрос
    #32007086
Fompro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
, @Sql nvarchar(500)
...
Рейтинг: 0 / 0
Надо вот такой вопрос
    #32007126
zamm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще то, если если использовать ADO, то эта проблема решается очень просто - через свойства самого АДО, и не надо морочить голову ни себе ни людям
. Тем более что речь идет, наверняка, об ASP.

Recordeset.PageSize
Recordeset.AbsolutePage
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Надо вот такой вопрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]