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

Ну, если временная таблица отметается (интересно почему), то тогда разве что курсором, о производительности умолчу
...
Рейтинг: 0 / 0
04.06.2001, 12:33
    #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
04.06.2001, 13:08
    #32006917
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо вот такой вопрос
2 Дмитрий Голубев

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

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

Такой запрос не будет гарантированно выдавать нужные страницы, записи то не упорядочены, разве что с индексом, да и то сомневаюсь я.
...
Рейтинг: 0 / 0
05.06.2001, 07:17
    #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
05.06.2001, 07:41
    #32006957
Надо вот такой вопрос
2 Genady
По идее если добавить ORDER BY, то должно выдавать корректный результат.
Хотя мне тоже мой вариант не очень нравится, т.к. при большом кол-ве записей работать будет довольно медленно.
Но как видите, ключик всетаки существует.
...
Рейтинг: 0 / 0
05.06.2001, 07:48
    #32006962
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо вот такой вопрос
2 Andy

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

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

Да нет, если использовать курсор, то скорее всего будет еще медленней. Order by конечно поможе, вот только если кто нить вклинится между такими запросами и добавит данные (или наоборот удалит), вот тогда весело будет
...
Рейтинг: 0 / 0
05.06.2001, 08:15
    #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
05.06.2001, 08:36
    #32006969
Andy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо вот такой вопрос
2 Genady

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

Можно использовать запрос Дмитрия Голубева, но только если таблица используется только для чтения, иначе поимеете проблемы о которых я писал в ответе ему.
...
Рейтинг: 0 / 0
05.06.2001, 10:43
    #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
06.06.2001, 16:56
    #32007086
Fompro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо вот такой вопрос
, @Sql nvarchar(500)
...
Рейтинг: 0 / 0
07.06.2001, 08:59
    #32007126
zamm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо вот такой вопрос
Вообще то, если если использовать ADO, то эта проблема решается очень просто - через свойства самого АДО, и не надо морочить голову ни себе ни людям
. Тем более что речь идет, наверняка, об ASP.

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


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