Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Функция для выборки записей в диапазоне номеров / 10 сообщений из 10, страница 1 из 1
25.05.2019, 16:23
    #39818216
MsGuns
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для выборки записей в диапазоне номеров
Здравствуйте, форумчане !
Есть некая View, возвращающая полный список абонентов сети.
Для сайта необходим постраничный просмотр этого списка. Соответственно нужна UDF, которая по заданному номеру страницы (листа) и кол-ву строк на листе будет возвращать подмножество записей. Доп. условие : предварительная сортировка по указанному столбцу.
Т.е. на входе три параметра: кол-во строк на листе, номер листа и имя столбца для сортировки, на выходе - от 0 до N записей, где N=кол-во строк на листе.

Помогите, пожалуйста, хотя бы ссылкой, где найти подходящий пример. Так давно не писал на TSQL, что почти все позабыл :)

Заранее спасибо за любую помощь
...
Рейтинг: 0 / 0
25.05.2019, 17:29
    #39818230
vikkiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для выборки записей в диапазоне номеров
MsGuns,

Код: sql
1.
2.
...ORDER BY Tel_Num DESC
OFFSET 100 ROWS FETCH NEXT 50 ROWS ONLY


например так https://rextester.com/live/YQDA46874
...
Рейтинг: 0 / 0
25.05.2019, 19:14
    #39818241
MsGuns
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для выборки записей в диапазоне номеров
Возвращает только один столбец с номерами строк, а нужно все столбцы вьюхи
...
Рейтинг: 0 / 0
25.05.2019, 19:31
    #39818244
vikkiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для выборки записей в диапазоне номеров
MsGuns,

вьюхи о которой здесь никто кроме автора не знает, а все хрустальные шары на лето расходятся по лесам в походы для обрядов и ритуалов.
убери строку WITH, заменяй объект после FROM на нужный и перечесляй после SELECT необходимые поля, строка с option тоже будет не нужна
...
Рейтинг: 0 / 0
25.05.2019, 20:15
    #39818254
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для выборки записей в диапазоне номеров
MsGunsСоответственно нужна UDF

Либо у вас очень специфичные условия, вроде того , что надо учитывать обновление view при отображении списка пользователю или у вас версия сервера 11, и вы забыли об этом написать, либо вы не удосужились погуглить и/или с 2011 года не читали документацию.
...
Рейтинг: 0 / 0
26.05.2019, 17:09
    #39818414
MsGuns
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для выборки записей в диапазоне номеров
Версия сервера 11.0.5388.0

Нумерация в общем не нужна - я ее проставлю в разметке Html

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
DECLARE @colname1 nvarchar(max)
DECLARE @nlist int
DECLARE @qrowsbylist int

DECLARE @sql1 nvarchar(max)

-- Инициализация (отладка) --
Set @colname1 = 'FIO_Fam'
Set @nlist = 2
Set @qrowsbylist = 10

-- Формирование строки'
Set @sql1 = 'select * from UsFN_Get_FullTelInfo() order by '+@colname1

--exec sp_executesql @sql1 

set @sql1 = @sql1+' OFFSET '+ cast((@nlist-1)*@qrowsbylist as varchar) +' ROWS FETCH NEXT ' + cast(@qrowsbylist as varchar)+ ' ROWS ONLY'

exec sp_executesql @sql1 



Так все работает. Но если завернуть это в UDF, то кричит, что в теле функции вызов Execute невозможен
...
Рейтинг: 0 / 0
26.05.2019, 17:49
    #39818422
vikkiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для выборки записей в диапазоне номеров
MsGuns,

Не execute, а конкретней: в функции запрещён вызов хранимых процедур (за исключением узкого круга избранных M$)
почему-то Microsoft из-за вопросов безопасности (а Dyn_SQL один из самых опасных подходов) не отдаёт это даже на усмотрение администраторов сервера
я обходил через Assemblies (делал свою C# сборку и встраивал в SQL Сервер) - тогда вызов функции (в свою очередь вызывающей SP) из сборки работает.

Если есть возможность то обычно вместо UDF это заворачивают в stored_procedure (с теми-же параметрами), тогда такого ограничения нет (там другую SP можно вызывать)

Но вообще многое из этого делается на клиенте при формировании нормального запроса (из выбранных пользователем параметров)
...
Рейтинг: 0 / 0
26.05.2019, 18:29
    #39818435
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для выборки записей в диапазоне номеров
Никакой sql_execute не нужен (имхо, это вообще крайняя мера).

Вариант без нумерации:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create function udf_GetPagedView(
  @colname sysname, 
  @offset int,
  @length int
) returns table as 
return select * from sys.objects
 order by case
  when @colname = 'object_id' then object_id
  when @colname = 'name' then name
  -- тут еще другие могут быть столбцы
 end
 offset @offset rows fetch next @length rows only
go


И с нумерацией:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create function udf_GetPagedViewWithNum(
  @colname sysname, 
  @offset int,
  @length int
) returns table as 
return
 select * from
 (select row_number() over(
    order by case
      when @colname = 'object_id' then object_id
      when @colname = 'name' then name
      -- тут тоже могут быть другие столбцы
    end) RowNum, * from sys.objects) t
  where @offset < RowNum and RowNum <= @offset + @length
go
...
Рейтинг: 0 / 0
27.05.2019, 12:46
    #39818732
MsGuns
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для выборки записей в диапазоне номеров
fkthat, все получилось ОТЛИЧНО ! Второй вариант (с нумерацией) не прошел ("Функция Row_Number не имеет аргументов"), но вполне хватит первого ! Огромного спасибо !

Отдельные благодарности:
vikkiv - за полезные пояснения и быстроту реакции
PizzaPizza - за розги - без них хуже доходит :)
fkthat - за фактически готовое решение и науку
всем - за внимание и потраченное время

Отличный форум !
...
Рейтинг: 0 / 0
27.05.2019, 12:52
    #39818734
MsGuns
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для выборки записей в диапазоне номеров
vikkivНо вообще многое из этого делается на клиенте при формировании нормального запроса (из выбранных пользователем параметров)

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


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