Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Надо вот такой вопрос
|
|||
|---|---|---|---|
|
#18+
Народ подскажите можно ли такое сотворить средствами TSQL... Таблица без ключа... Не допускается создание временной таблицы... Запросу дается два параметра "Максимальное количество строк на странице", "Номер страницы" Запрос разбивает все строки по страницам (1 страница равна "Макс. кол-ву строк") и возвращает нужную страницу, то есть строки из нужной страницы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2001, 11:38 |
|
||
|
Надо вот такой вопрос
|
|||
|---|---|---|---|
|
#18+
>Таблица без ключа... Круто Ну, если временная таблица отметается (интересно почему), то тогда разве что курсором, о производительности умолчу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2001, 11:46 |
|
||
|
Надо вот такой вопрос
|
|||
|---|---|---|---|
|
#18+
Кривовато, но работает %) Какой то ключ, по которому отсортироваты записи, ввести все равно придется. 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 ) Удачи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2001, 12:33 |
|
||
|
Надо вот такой вопрос
|
|||
|---|---|---|---|
|
#18+
2 Дмитрий Голубев Хех, а по условию в табличке ключиков то нет следовательно FieldID не уникально, как думаете, какой результат будет у Вашего запроса А в общем мне идея понравилась. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2001, 13:08 |
|
||
|
Надо вот такой вопрос
|
|||
|---|---|---|---|
|
#18+
Не, передумал, уже не нравится идея Такой запрос не будет гарантированно выдавать нужные страницы, записи то не упорядочены, разве что с индексом, да и то сомневаюсь я. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2001, 13:15 |
|
||
|
Надо вот такой вопрос
|
|||
|---|---|---|---|
|
#18+
Спасибо... ваш запрос тоже гениальный... Но по условию мне действительно нельзя привязываться к ключи... а он конечно есть и не один...Решение нашел чем и делюсь... 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 ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2001, 07:17 |
|
||
|
Надо вот такой вопрос
|
|||
|---|---|---|---|
|
#18+
2 Genady По идее если добавить ORDER BY, то должно выдавать корректный результат. Хотя мне тоже мой вариант не очень нравится, т.к. при большом кол-ве записей работать будет довольно медленно. Но как видите, ключик всетаки существует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2001, 07:41 |
|
||
|
Надо вот такой вопрос
|
|||
|---|---|---|---|
|
#18+
2 Andy А если дырки будут в identity поле, результат запроса Вас все равно устроит? 2 Дмитрий Голубев Да нет, если использовать курсор, то скорее всего будет еще медленней. Order by конечно поможе, вот только если кто нить вклинится между такими запросами и добавит данные (или наоборот удалит), вот тогда весело будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2001, 07:48 |
|
||
|
Надо вот такой вопрос
|
|||
|---|---|---|---|
|
#18+
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. Вообщем это тоже не решение, а самообман. А можно поинтересоваться почему "Не допускается создание временной таблицы"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2001, 08:15 |
|
||
|
Надо вот такой вопрос
|
|||
|---|---|---|---|
|
#18+
2 Genady Честно говоря не очень понял относительно дырок... Если можно подробнее ... 2 Всем... Чтоб не было споров описываю задачу... Вэб приложение ... таблица и n-ое количество полей добавляющих в запрос условия выборки из SQL таблицы...которые отображаются в таблице на страничке... Раз вэб значит создание никаких временных таблиц не допустимо... Раз много условий выборки значения родных для таблицы ключей не имеет смысла... и привязываться к ним нельзя... и как я говорил надо выводить информацию с разбиением по страницам... и кнопки назад, вперед, в конец, в начало.. Вот по этому вбираем данные создаем искуственное последовательное поле ключа для них... и по значению этого поля разбиваем на страницы... А синтаксис запроса я просто сохранил поскольку к нему привыкли... Вроде все правильно... разве нет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2001, 08:36 |
|
||
|
Надо вот такой вопрос
|
|||
|---|---|---|---|
|
#18+
>Честно говоря не очень понял относительно дырок... Если можно подробнее Объясняю у Вас есть записи с айдишками 1, 2, 3, 4 затем удаляется запись 2 и Вы получаете 1, 3, 4, затем добавляется запись 5 и тут же удаляется при добавлении следующей записи Вы получите 1, 3, 4, 6. > Раз вэб значит создание никаких временных таблиц не допустимо... Странное утверждение, а почему сбсно? >Раз много условий выборки значения родных для таблицы ключей не имеет смысла... и привязываться к ним нельзя... Еще более запутано. Причем здесь ключ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2001, 08:48 |
|
||
|
Надо вот такой вопрос
|
|||
|---|---|---|---|
|
#18+
Про дырки... А собственно когда и кем удаляются записи... запрос на выборку отработал.. пронумеровал строки.. зачем в нем данные править... данные правятся отдельными запросами... insert update... Временные таблицы... Кстати интересный вопрос... просветите... 100 пользователей одновременно создают в tempdb таблицу с одним и тем же именем.. Будут конфликты...? Даже если не будет.. мне кажется один запрос с INENTITYCOL будет менее гнуть производительность чем два с созданием временной таблицы... один создает другой выбирает... к тому же в создании будет та же функция... IDENTITY(int,1,1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2001, 09:15 |
|
||
|
Надо вот такой вопрос
|
|||
|---|---|---|---|
|
#18+
>А собственно когда и кем удаляются записи... запрос на выборку отработал.. пронумеровал строки.. зачем в нем данные править... данные правятся отдельными запросами... insert update... Запрос не нумерует строки, а возвращает значения поля identity, которе есть в Вашей таблице, попробуте удалить это поле и выполнить запрос >Кстати интересный вопрос... просветите... 100 пользователей одновременно создают в tempdb таблицу с одним и тем же именем.. Будут конфликты...? Нет, конечно не будет конфликтов, временная таблица видна только в рамках коннекта. Используйте временную таблицу и не мучайтесь Можно использовать запрос Дмитрия Голубева, но только если таблица используется только для чтения, иначе поимеете проблемы о которых я писал в ответе ему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2001, 10:39 |
|
||
|
Надо вот такой вопрос
|
|||
|---|---|---|---|
|
#18+
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-й - то через таблицы-переменные. Может если и будет чуть помедленней, но хоть потом можно будет разобраться в написанном. С приветом Сергей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2001, 10:43 |
|
||
|
Надо вот такой вопрос
|
|||
|---|---|---|---|
|
#18+
, @Sql nvarchar(500) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2001, 16:56 |
|
||
|
Надо вот такой вопрос
|
|||
|---|---|---|---|
|
#18+
Вообще то, если если использовать ADO, то эта проблема решается очень просто - через свойства самого АДО, и не надо морочить голову ни себе ни людям . Тем более что речь идет, наверняка, об ASP. Recordeset.PageSize Recordeset.AbsolutePage ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2001, 08:59 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32006981&tid=1826557]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
27ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 337ms |

| 0 / 0 |
